diff options
Diffstat (limited to 'remoting')
46 files changed, 578 insertions, 149 deletions
diff --git a/remoting/base/constants.cc b/remoting/base/constants.cc index a93f0f4..0099570 100644 --- a/remoting/base/constants.cc +++ b/remoting/base/constants.cc @@ -6,8 +6,6 @@ namespace remoting { -const char kChromotingBotJid[] = "remoting@bot.talk.google.com"; - const char kChromotingTokenDefaultServiceName[] = "chromiumsync"; const char kChromotingXmlNamespace[] = "google:remoting"; diff --git a/remoting/base/constants.h b/remoting/base/constants.h index f5ea537..80c5572 100644 --- a/remoting/base/constants.h +++ b/remoting/base/constants.h @@ -7,8 +7,6 @@ namespace remoting { -extern const char kChromotingBotJid[]; - // Service name used for authentication. // TODO(ajwong): Remove this once we've killed off XmppToken usage. // BUG:83897 diff --git a/remoting/host/heartbeat_sender.cc b/remoting/host/heartbeat_sender.cc index 167b5e1..0a5a181 100644 --- a/remoting/host/heartbeat_sender.cc +++ b/remoting/host/heartbeat_sender.cc @@ -49,11 +49,13 @@ HeartbeatSender::HeartbeatSender( Listener* listener, const std::string& host_id, SignalStrategy* signal_strategy, - HostKeyPair* key_pair) + HostKeyPair* key_pair, + const std::string& directory_bot_jid) : listener_(listener), host_id_(host_id), signal_strategy_(signal_strategy), key_pair_(key_pair), + directory_bot_jid_(directory_bot_jid), interval_ms_(kDefaultHeartbeatIntervalMs), sequence_id_(0), sequence_id_was_set_(false), @@ -107,9 +109,9 @@ void HeartbeatSender::ResendStanza() { } void HeartbeatSender::DoSendStanza() { - VLOG(1) << "Sending heartbeat stanza to " << kChromotingBotJid; + VLOG(1) << "Sending heartbeat stanza to " << directory_bot_jid_; request_ = iq_sender_->SendIq( - buzz::STR_SET, kChromotingBotJid, CreateHeartbeatMessage(), + buzz::STR_SET, directory_bot_jid_, CreateHeartbeatMessage(), base::Bind(&HeartbeatSender::ProcessResponse, base::Unretained(this))); ++sequence_id_; diff --git a/remoting/host/heartbeat_sender.h b/remoting/host/heartbeat_sender.h index 2fb2dae..2d0986d 100644 --- a/remoting/host/heartbeat_sender.h +++ b/remoting/host/heartbeat_sender.h @@ -92,7 +92,8 @@ class HeartbeatSender : public SignalStrategy::Listener { HeartbeatSender(Listener* listener, const std::string& host_id, SignalStrategy* signal_strategy, - HostKeyPair* key_pair); + HostKeyPair* key_pair, + const std::string& directory_bot_jid); virtual ~HeartbeatSender(); // SignalStrategy::Listener interface. @@ -125,6 +126,7 @@ class HeartbeatSender : public SignalStrategy::Listener { std::string host_id_; SignalStrategy* signal_strategy_; HostKeyPair* key_pair_; + std::string directory_bot_jid_; scoped_ptr<IqSender> iq_sender_; scoped_ptr<IqRequest> request_; int interval_ms_; diff --git a/remoting/host/heartbeat_sender_unittest.cc b/remoting/host/heartbeat_sender_unittest.cc index 4d050d7d..0947937 100644 --- a/remoting/host/heartbeat_sender_unittest.cc +++ b/remoting/host/heartbeat_sender_unittest.cc @@ -34,6 +34,7 @@ using testing::SaveArg; namespace remoting { namespace { +const char kTestBotJid[] = "remotingunittest@bot.talk.google.com"; const char kHostId[] = "0"; const char kTestJid[] = "user@gmail.com/chromoting123"; const char kStanzaId[] = "123"; @@ -68,8 +69,8 @@ class HeartbeatSenderTest EXPECT_CALL(signal_strategy_, GetLocalJid()) .WillRepeatedly(Return(kTestJid)); - heartbeat_sender_.reset( - new HeartbeatSender(this, kHostId, &signal_strategy_, &key_pair_)); + heartbeat_sender_.reset(new HeartbeatSender( + this, kHostId, &signal_strategy_, &key_pair_, kTestBotJid)); } virtual void TearDown() OVERRIDE { @@ -220,7 +221,7 @@ TEST_F(HeartbeatSenderTest, ProcessResponseSetInterval) { void HeartbeatSenderTest::ValidateHeartbeatStanza( XmlElement* stanza, const char* expectedSequenceId) { EXPECT_EQ(stanza->Attr(buzz::QName("", "to")), - std::string(kChromotingBotJid)); + std::string(kTestBotJid)); EXPECT_EQ(stanza->Attr(buzz::QName("", "type")), "set"); XmlElement* heartbeat_stanza = stanza->FirstNamed(QName(kChromotingXmlNamespace, "heartbeat")); diff --git a/remoting/host/host_change_notification_listener.cc b/remoting/host/host_change_notification_listener.cc index 995928b..4805ec3 100644 --- a/remoting/host/host_change_notification_listener.cc +++ b/remoting/host/host_change_notification_listener.cc @@ -23,10 +23,12 @@ namespace remoting { HostChangeNotificationListener::HostChangeNotificationListener( Listener* listener, const std::string& host_id, - SignalStrategy* signal_strategy) + SignalStrategy* signal_strategy, + const std::string& directory_bot_jid) : listener_(listener), host_id_(host_id), signal_strategy_(signal_strategy), + directory_bot_jid_(directory_bot_jid), ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { DCHECK(signal_strategy_); @@ -55,7 +57,7 @@ bool HostChangeNotificationListener::OnSignalStrategyIncomingStanza( host_changed_element->Attr(QName(kChromotingXmlNamespace, "hostid")); const std::string& from = stanza->Attr(buzz::QN_FROM); const std::string& to = stanza->Attr(buzz::QN_TO); - if (host_id == host_id_ && from == kChromotingBotJid && + if (host_id == host_id_ && from == directory_bot_jid_ && to == signal_strategy_->GetLocalJid()) { const std::string& operation = host_changed_element->Attr(QName(kChromotingXmlNamespace, "operation")); diff --git a/remoting/host/host_change_notification_listener.h b/remoting/host/host_change_notification_listener.h index 19ee106..ae1ba0e 100644 --- a/remoting/host/host_change_notification_listener.h +++ b/remoting/host/host_change_notification_listener.h @@ -35,7 +35,8 @@ class HostChangeNotificationListener : public SignalStrategy::Listener { // Both listener and signal_strategy are expected to outlive this object. HostChangeNotificationListener(Listener* listener, const std::string& host_id, - SignalStrategy* signal_strategy); + SignalStrategy* signal_strategy, + const std::string& directory_bot_jid); virtual ~HostChangeNotificationListener(); // SignalStrategy::Listener interface. @@ -50,6 +51,7 @@ class HostChangeNotificationListener : public SignalStrategy::Listener { Listener* listener_; std::string host_id_; SignalStrategy* signal_strategy_; + std::string directory_bot_jid_; base::WeakPtrFactory<HostChangeNotificationListener> weak_factory_; DISALLOW_COPY_AND_ASSIGN(HostChangeNotificationListener); }; diff --git a/remoting/host/host_change_notification_listener_unittest.cc b/remoting/host/host_change_notification_listener_unittest.cc index a0f124f..1f9305e 100644 --- a/remoting/host/host_change_notification_listener_unittest.cc +++ b/remoting/host/host_change_notification_listener_unittest.cc @@ -28,6 +28,7 @@ namespace remoting { namespace { const char kHostId[] = "0"; const char kTestJid[] = "user@gmail.com/chromoting123"; +const char kTestBotJid[] = "remotingunittest@bot.talk.google.com"; } // namespace ACTION_P(AddListener, list) { @@ -56,7 +57,7 @@ class HostChangeNotificationListenerTest : public testing::Test { .WillRepeatedly(Return(kTestJid)); host_change_notification_listener_.reset(new HostChangeNotificationListener( - &mock_listener_, kHostId, &signal_strategy_)); + &mock_listener_, kHostId, &signal_strategy_, kTestBotJid)); } virtual void TearDown() OVERRIDE { @@ -91,7 +92,7 @@ TEST_F(HostChangeNotificationListenerTest, ReceiveValidNotification) { EXPECT_CALL(mock_listener_, OnHostDeleted()) .WillOnce(Return()); scoped_ptr<XmlElement> stanza = GetNotificationStanza( - "delete", kHostId, kChromotingBotJid); + "delete", kHostId, kTestBotJid); host_change_notification_listener_->OnSignalStrategyIncomingStanza( stanza.get()); message_loop_.PostTask(FROM_HERE, base::Bind(MessageLoop::QuitClosure())); @@ -102,7 +103,7 @@ TEST_F(HostChangeNotificationListenerTest, ReceiveNotificationBeforeDelete) { EXPECT_CALL(mock_listener_, OnHostDeleted()) .Times(0); scoped_ptr<XmlElement> stanza = GetNotificationStanza( - "delete", kHostId, kChromotingBotJid); + "delete", kHostId, kTestBotJid); host_change_notification_listener_->OnSignalStrategyIncomingStanza( stanza.get()); host_change_notification_listener_.reset(); @@ -115,7 +116,7 @@ TEST_F(HostChangeNotificationListenerTest, ReceiveInvalidHostIdNotification) { EXPECT_CALL(mock_listener_, OnHostDeleted()) .Times(0); scoped_ptr<XmlElement> stanza = GetNotificationStanza( - "delete", "1", kChromotingBotJid); + "delete", "1", kTestBotJid); host_change_notification_listener_->OnSignalStrategyIncomingStanza( stanza.get()); message_loop_.PostTask(FROM_HERE, base::Bind(MessageLoop::QuitClosure())); @@ -137,7 +138,7 @@ TEST_F(HostChangeNotificationListenerTest, ReceiveNonDeleteNotification) { EXPECT_CALL(mock_listener_, OnHostDeleted()) .Times(0); scoped_ptr<XmlElement> stanza = GetNotificationStanza( - "update", kHostId, kChromotingBotJid); + "update", kHostId, kTestBotJid); host_change_notification_listener_->OnSignalStrategyIncomingStanza( stanza.get()); message_loop_.PostTask(FROM_HERE, base::Bind(MessageLoop::QuitClosure())); diff --git a/remoting/host/log_to_server.cc b/remoting/host/log_to_server.cc index a184de0..f4830f6 100644 --- a/remoting/host/log_to_server.cc +++ b/remoting/host/log_to_server.cc @@ -22,10 +22,12 @@ namespace remoting { LogToServer::LogToServer(ChromotingHost* host, ServerLogEntry::Mode mode, - SignalStrategy* signal_strategy) + SignalStrategy* signal_strategy, + const std::string& directory_bot_jid) : host_(host), mode_(mode), - signal_strategy_(signal_strategy) { + signal_strategy_(signal_strategy), + directory_bot_jid_(directory_bot_jid) { signal_strategy_->AddListener(this); // |host| may be NULL in tests. @@ -113,7 +115,7 @@ void LogToServer::SendPendingEntries() { } // Send the stanza to the server. scoped_ptr<IqRequest> req = iq_sender_->SendIq( - buzz::STR_SET, kChromotingBotJid, stanza.Pass(), + buzz::STR_SET, directory_bot_jid_, stanza.Pass(), IqSender::ReplyCallback()); // We ignore any response, so let the IqRequest be destroyed. return; diff --git a/remoting/host/log_to_server.h b/remoting/host/log_to_server.h index c1f844a..e65adae 100644 --- a/remoting/host/log_to_server.h +++ b/remoting/host/log_to_server.h @@ -39,7 +39,8 @@ class LogToServer : public base::NonThreadSafe, public: explicit LogToServer(ChromotingHost* host, ServerLogEntry::Mode mode, - SignalStrategy* signal_strategy); + SignalStrategy* signal_strategy, + const std::string& directory_bot_jid); virtual ~LogToServer(); // Logs a session state change. Currently, this is either @@ -68,6 +69,8 @@ class LogToServer : public base::NonThreadSafe, ServerLogEntry::Mode mode_; SignalStrategy* signal_strategy_; scoped_ptr<IqSender> iq_sender_; + std::string directory_bot_jid_; + // A map from client JID to the route type of that client's connection to // this host. std::map<std::string, protocol::TransportRoute::RouteType> diff --git a/remoting/host/log_to_server_unittest.cc b/remoting/host/log_to_server_unittest.cc index 54674fa..4277e49 100644 --- a/remoting/host/log_to_server_unittest.cc +++ b/remoting/host/log_to_server_unittest.cc @@ -28,6 +28,7 @@ ACTION_P(QuitMainMessageLoop, message_loop) { const char kJabberClientNamespace[] = "jabber:client"; const char kChromotingNamespace[] = "google:remoting"; +const char kTestBotJid[] = "remotingunittest@bot.talk.google.com"; const char kClientJid1[] = "client@domain.com/1234"; const char kClientJid2[] = "client@domain.com/5678"; const char kHostJid[] = "host@domain.com/1234"; @@ -125,7 +126,8 @@ class LogToServerTest : public testing::Test { message_loop_proxy_ = base::MessageLoopProxy::current(); EXPECT_CALL(signal_strategy_, AddListener(_)); log_to_server_.reset( - new LogToServer(NULL, ServerLogEntry::ME2ME, &signal_strategy_)); + new LogToServer(NULL, ServerLogEntry::ME2ME, &signal_strategy_, + kTestBotJid)); EXPECT_CALL(signal_strategy_, RemoveListener(_)); } diff --git a/remoting/host/plugin/host_plugin.cc b/remoting/host/plugin/host_plugin.cc index 4b9c714..247dd06 100644 --- a/remoting/host/plugin/host_plugin.cc +++ b/remoting/host/plugin/host_plugin.cc @@ -10,6 +10,7 @@ #include "base/at_exit.h" #include "base/basictypes.h" +#include "base/command_line.h" #include "base/logging.h" #include "base/strings/stringize_macros.h" #include "net/socket/ssl_server_socket.h" @@ -500,6 +501,8 @@ EXPORT NPError API_CALL NP_Initialize(NPNetscapeFuncs* npnetscape_funcs #if defined(OS_POSIX) && !defined(OS_MACOSX) NP_GetEntryPoints(nppfuncs); #endif + // Init an empty command line for common objects that use it. + CommandLine::Init(0, NULL); return NPERR_NO_ERROR; } diff --git a/remoting/host/plugin/host_script_object.cc b/remoting/host/plugin/host_script_object.cc index 0c14151..82c991d 100644 --- a/remoting/host/plugin/host_script_object.cc +++ b/remoting/host/plugin/host_script_object.cc @@ -10,6 +10,7 @@ #include "base/message_loop.h" #include "base/message_loop_proxy.h" #include "base/string_util.h" +#include "base/stringprintf.h" #include "base/sys_string_conversions.h" #include "base/threading/platform_thread.h" #include "base/utf_string_conversions.h" @@ -31,9 +32,11 @@ #include "remoting/host/plugin/host_log_handler.h" #include "remoting/host/policy_hack/policy_watcher.h" #include "remoting/host/register_support_host_request.h" +#include "remoting/host/service_urls.h" #include "remoting/host/session_manager_factory.h" #include "remoting/jingle_glue/xmpp_signal_strategy.h" #include "remoting/protocol/it2me_host_authenticator_factory.h" +#include "third_party/npapi/bindings/npruntime.h" namespace remoting { @@ -51,6 +54,9 @@ const char* kAttrNameLogDebugInfo = "logDebugInfo"; const char* kAttrNameOnNatTraversalPolicyChanged = "onNatTraversalPolicyChanged"; const char* kAttrNameOnStateChanged = "onStateChanged"; +const char* kAttrNameXmppServerAddress = "xmppServerAddress"; +const char* kAttrNameXmppServerUseTls = "xmppServerUseTls"; +const char* kAttrNameDirectoryBotJid = "directoryBotJid"; const char* kFuncNameConnect = "connect"; const char* kFuncNameDisconnect = "disconnect"; const char* kFuncNameLocalize = "localize"; @@ -86,7 +92,9 @@ class HostNPScriptObject::It2MeImpl It2MeImpl( scoped_ptr<ChromotingHostContext> context, scoped_refptr<base::SingleThreadTaskRunner> plugin_task_runner, - base::WeakPtr<HostNPScriptObject> script_object); + base::WeakPtr<HostNPScriptObject> script_object, + const XmppSignalStrategy::XmppServerConfig& xmpp_server_config, + const std::string& directory_bot_jid); // Methods called by the script object, from the plugin thread. @@ -145,9 +153,12 @@ class HostNPScriptObject::It2MeImpl void UpdateNatPolicy(bool nat_traversal_enabled); void UpdateHostDomainPolicy(const std::string& host_domain); + // Caller supplied fields. scoped_ptr<ChromotingHostContext> host_context_; scoped_refptr<base::SingleThreadTaskRunner> plugin_task_runner_; base::WeakPtr<HostNPScriptObject> script_object_; + XmppSignalStrategy::XmppServerConfig xmpp_server_config_; + std::string directory_bot_jid_; State state_; @@ -187,10 +198,14 @@ class HostNPScriptObject::It2MeImpl HostNPScriptObject::It2MeImpl::It2MeImpl( scoped_ptr<ChromotingHostContext> host_context, scoped_refptr<base::SingleThreadTaskRunner> plugin_task_runner, - base::WeakPtr<HostNPScriptObject> script_object) + base::WeakPtr<HostNPScriptObject> script_object, + const XmppSignalStrategy::XmppServerConfig& xmpp_server_config, + const std::string& directory_bot_jid) : host_context_(host_context.Pass()), plugin_task_runner_(plugin_task_runner), script_object_(script_object), + xmpp_server_config_(xmpp_server_config), + directory_bot_jid_(directory_bot_jid), state_(kDisconnected), failed_login_attempts_(0), nat_traversal_enabled_(false), @@ -334,12 +349,13 @@ void HostNPScriptObject::It2MeImpl::FinishConnect( // Create XMPP connection. scoped_ptr<SignalStrategy> signal_strategy( new XmppSignalStrategy(host_context_->url_request_context_getter(), - uid, auth_token, auth_service)); + uid, auth_token, auth_service, + xmpp_server_config_)); // Request registration of the host for support. scoped_ptr<RegisterSupportHostRequest> register_request( new RegisterSupportHostRequest( - signal_strategy.get(), &host_key_pair_, + signal_strategy.get(), &host_key_pair_, directory_bot_jid_, base::Bind(&It2MeImpl::OnReceivedSupportID, base::Unretained(this)))); @@ -372,7 +388,8 @@ void HostNPScriptObject::It2MeImpl::FinishConnect( host_context_->ui_task_runner()); host_->AddStatusObserver(this); log_to_server_.reset( - new LogToServer(host_, ServerLogEntry::IT2ME, signal_strategy_.get())); + new LogToServer(host_, ServerLogEntry::IT2ME, signal_strategy_.get(), + directory_bot_jid_)); // Disable audio by default. // TODO(sergeyu): Add UI to enable it. @@ -658,6 +675,14 @@ HostNPScriptObject::HostNPScriptObject( ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), weak_ptr_(weak_factory_.GetWeakPtr()) { DCHECK(plugin_task_runner_->BelongsToCurrentThread()); + ServiceUrls* service_urls = ServiceUrls::GetInstance(); + bool xmpp_server_valid = net::ParseHostAndPort( + service_urls->xmpp_server_address(), + &xmpp_server_config_.host, &xmpp_server_config_.port); + // For the plugin, this is always the default address, which must be valid. + DCHECK(xmpp_server_valid); + xmpp_server_config_.use_tls = service_urls->xmpp_server_use_tls(); + directory_bot_jid_ = service_urls->directory_bot_jid(); // Create worker thread for encryption key generation. worker_thread_ = AutoThread::Create("ChromotingWorkerThread", @@ -755,7 +780,10 @@ bool HostNPScriptObject::HasProperty(const std::string& property_name) { property_name == kAttrNameReceivedAccessCode || property_name == kAttrNameConnected || property_name == kAttrNameDisconnecting || - property_name == kAttrNameError); + property_name == kAttrNameError || + property_name == kAttrNameXmppServerAddress || + property_name == kAttrNameXmppServerUseTls || + property_name == kAttrNameDirectoryBotJid); } bool HostNPScriptObject::GetProperty(const std::string& property_name, @@ -815,6 +843,16 @@ bool HostNPScriptObject::GetProperty(const std::string& property_name, } else if (property_name == kAttrNameInvalidDomainError) { INT32_TO_NPVARIANT(kInvalidDomainError, *result); return true; + } else if (property_name == kAttrNameXmppServerAddress) { + *result = NPVariantFromString(base::StringPrintf( + "%s:%u", xmpp_server_config_.host.c_str(), xmpp_server_config_.port)); + return true; + } else if (property_name == kAttrNameXmppServerUseTls) { + BOOLEAN_TO_NPVARIANT(xmpp_server_config_.use_tls, *result); + return true; + } else if (property_name == kAttrNameDirectoryBotJid) { + *result = NPVariantFromString(directory_bot_jid_); + return true; } else { SetException("GetProperty: unsupported property " + property_name); return false; @@ -864,6 +902,48 @@ bool HostNPScriptObject::SetProperty(const std::string& property_name, return false; } +#if !defined(NDEBUG) + if (property_name == kAttrNameXmppServerAddress) { + if (NPVARIANT_IS_STRING(*value)) { + std::string address = StringFromNPVariant(*value); + bool xmpp_server_valid = net::ParseHostAndPort( + address, &xmpp_server_config_.host, &xmpp_server_config_.port); + if (xmpp_server_valid) { + return true; + } else { + SetException("SetProperty: invalid value for property " + + property_name); + } + } else { + SetException("SetProperty: unexpected type for property " + + property_name); + } + return false; + } + + if (property_name == kAttrNameXmppServerUseTls) { + if (NPVARIANT_IS_BOOLEAN(*value)) { + xmpp_server_config_.use_tls = NPVARIANT_TO_BOOLEAN(*value); + return true; + } else { + SetException("SetProperty: unexpected type for property " + + property_name); + } + return false; + } + + if (property_name == kAttrNameDirectoryBotJid) { + if (NPVARIANT_IS_STRING(*value)) { + directory_bot_jid_ = StringFromNPVariant(*value); + return true; + } else { + SetException("SetProperty: unexpected type for property " + + property_name); + } + return false; + } +#endif // !defined(NDEBUG) + return false; } @@ -888,6 +968,9 @@ bool HostNPScriptObject::Enumerate(std::vector<std::string>* values) { kAttrNameConnected, kAttrNameDisconnecting, kAttrNameError, + kAttrNameXmppServerAddress, + kAttrNameXmppServerUseTls, + kAttrNameDirectoryBotJid, kFuncNameConnect, kFuncNameDisconnect, kFuncNameLocalize, @@ -951,7 +1034,8 @@ bool HostNPScriptObject::Connect(const NPVariant* args, // Create the It2Me host implementation and start connecting. it2me_impl_ = new It2MeImpl( - host_context.Pass(), plugin_task_runner_, weak_ptr_); + host_context.Pass(), plugin_task_runner_, weak_ptr_, + xmpp_server_config_, directory_bot_jid_); it2me_impl_->Connect(uid, auth_token, auth_service, ui_strings_); return true; diff --git a/remoting/host/plugin/host_script_object.h b/remoting/host/plugin/host_script_object.h index 22baee5..ffa1b1d 100644 --- a/remoting/host/plugin/host_script_object.h +++ b/remoting/host/plugin/host_script_object.h @@ -26,6 +26,7 @@ #include "remoting/host/plugin/host_plugin_utils.h" #include "remoting/host/setup/daemon_controller.h" #include "remoting/host/ui_strings.h" +#include "remoting/jingle_glue/xmpp_signal_strategy.h" #include "third_party/npapi/bindings/npapi.h" #include "third_party/npapi/bindings/npfunctions.h" #include "third_party/npapi/bindings/npruntime.h" @@ -274,6 +275,12 @@ class HostNPScriptObject { // Localized strings for use by the |it2me_impl_| UI. UiStrings ui_strings_; + // IT2Me Talk server configuration used by |it2me_impl_| to connect. + XmppSignalStrategy::XmppServerConfig xmpp_server_config_; + + // Chromoting Bot JID used by |it2me_impl_| to register the host. + std::string directory_bot_jid_; + // Callbacks to notify in response to |it2me_impl_| events. ScopedRefNPObject on_nat_traversal_policy_changed_func_; ScopedRefNPObject on_state_changed_func_; diff --git a/remoting/host/register_support_host_request.cc b/remoting/host/register_support_host_request.cc index 1272c07..b149851 100644 --- a/remoting/host/register_support_host_request.cc +++ b/remoting/host/register_support_host_request.cc @@ -37,9 +37,11 @@ const char kSupportIdLifetimeTag[] = "support-id-lifetime"; RegisterSupportHostRequest::RegisterSupportHostRequest( SignalStrategy* signal_strategy, HostKeyPair* key_pair, + const std::string& directory_bot_jid, const RegisterCallback& callback) : signal_strategy_(signal_strategy), key_pair_(key_pair), + directory_bot_jid_(directory_bot_jid), callback_(callback) { DCHECK(signal_strategy_); DCHECK(key_pair_); @@ -58,7 +60,7 @@ void RegisterSupportHostRequest::OnSignalStrategyStateChange( DCHECK(!callback_.is_null()); request_ = iq_sender_->SendIq( - buzz::STR_SET, kChromotingBotJid, + buzz::STR_SET, directory_bot_jid_, CreateRegistrationRequest(signal_strategy_->GetLocalJid()).Pass(), base::Bind(&RegisterSupportHostRequest::ProcessResponse, base::Unretained(this))); diff --git a/remoting/host/register_support_host_request.h b/remoting/host/register_support_host_request.h index 8532534..fd9758c85 100644 --- a/remoting/host/register_support_host_request.h +++ b/remoting/host/register_support_host_request.h @@ -50,6 +50,7 @@ class RegisterSupportHostRequest : public SignalStrategy::Listener { // response. RegisterSupportHostRequest(SignalStrategy* signal_strategy, HostKeyPair* key_pair, + const std::string& directory_bot_jid, const RegisterCallback& callback); virtual ~RegisterSupportHostRequest(); @@ -75,6 +76,7 @@ class RegisterSupportHostRequest : public SignalStrategy::Listener { SignalStrategy* signal_strategy_; HostKeyPair* key_pair_; + std::string directory_bot_jid_; RegisterCallback callback_; scoped_ptr<IqSender> iq_sender_; diff --git a/remoting/host/register_support_host_request_unittest.cc b/remoting/host/register_support_host_request_unittest.cc index 0eb1c5f..81b5c42 100644 --- a/remoting/host/register_support_host_request_unittest.cc +++ b/remoting/host/register_support_host_request_unittest.cc @@ -32,6 +32,7 @@ using testing::SaveArg; namespace remoting { namespace { +const char kTestBotJid[] = "remotingunittest@bot.talk.google.com"; const char kTestJid[] = "user@gmail.com/chromoting123"; const int64 kTestTime = 123123123; const char kSupportId[] = "AB4RF3"; @@ -80,6 +81,7 @@ TEST_F(RegisterSupportHostRequestTest, Send) { scoped_ptr<RegisterSupportHostRequest> request( new RegisterSupportHostRequest(&signal_strategy_, &key_pair_, + kTestBotJid, base::Bind(&MockCallback::OnResponse, base::Unretained(&callback_)))); @@ -97,7 +99,7 @@ TEST_F(RegisterSupportHostRequestTest, Send) { ASSERT_TRUE(stanza != NULL); EXPECT_EQ(stanza->Attr(buzz::QName("", "to")), - std::string(kChromotingBotJid)); + std::string(kTestBotJid)); EXPECT_EQ(stanza->Attr(buzz::QName("", "type")), "set"); EXPECT_EQ(QName(kChromotingXmlNamespace, "register-support-host"), @@ -127,7 +129,7 @@ TEST_F(RegisterSupportHostRequestTest, Send) { base::TimeDelta::FromSeconds(300))); scoped_ptr<XmlElement> response(new XmlElement(buzz::QN_IQ)); - response->AddAttr(QName("", "from"), kChromotingBotJid); + response->AddAttr(QName("", "from"), kTestBotJid); response->AddAttr(QName("", "type"), "result"); response->AddAttr(QName("", "id"), kStanzaId); diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc index 1aa1f9c..b4a35bd 100644 --- a/remoting/host/remoting_me2me_host.cc +++ b/remoting/host/remoting_me2me_host.cc @@ -63,6 +63,7 @@ #include "remoting/host/network_settings.h" #include "remoting/host/policy_hack/policy_watcher.h" #include "remoting/host/resizing_host_observer.h" +#include "remoting/host/service_urls.h" #include "remoting/host/session_manager_factory.h" #include "remoting/host/signaling_connector.h" #include "remoting/host/ui_strings.h" @@ -275,6 +276,10 @@ class HostProcess // Accessed on the UI thread. scoped_ptr<IPC::ChannelProxy> daemon_channel_; + // XMPP server/remoting bot configuration (initialized from the command line). + XmppSignalStrategy::XmppServerConfig xmpp_server_config_; + std::string directory_bot_jid_; + // Created on the UI thread but used from the network thread. base::FilePath host_config_path_; scoped_ptr<DesktopEnvironmentFactory> desktop_environment_factory_; @@ -412,6 +417,17 @@ bool HostProcess::InitWithCommandLine(const CommandLine* cmd_line) { } #endif // !defined(REMOTING_MULTI_PROCESS) + ServiceUrls* service_urls = ServiceUrls::GetInstance(); + bool xmpp_server_valid = net::ParseHostAndPort( + service_urls->xmpp_server_address(), + &xmpp_server_config_.host, &xmpp_server_config_.port); + if (!xmpp_server_valid) { + LOG(ERROR) << "Invalid XMPP server: " << + service_urls->xmpp_server_address(); + return false; + } + xmpp_server_config_.use_tls = service_urls->xmpp_server_use_tls(); + directory_bot_jid_ = service_urls->directory_bot_jid(); return true; } @@ -867,7 +883,7 @@ void HostProcess::StartHost() { signal_strategy_.reset( new XmppSignalStrategy(context_->url_request_context_getter(), xmpp_login_, xmpp_auth_token_, - xmpp_auth_service_)); + xmpp_auth_service_, xmpp_server_config_)); scoped_ptr<DnsBlackholeChecker> dns_blackhole_checker( new DnsBlackholeChecker(context_->url_request_context_getter(), @@ -913,13 +929,14 @@ void HostProcess::StartHost() { #endif heartbeat_sender_.reset(new HeartbeatSender( - this, host_id_, signal_strategy_.get(), &key_pair_)); + this, host_id_, signal_strategy_.get(), &key_pair_, directory_bot_jid_)); host_change_notification_listener_.reset(new HostChangeNotificationListener( - this, host_id_, signal_strategy_.get())); + this, host_id_, signal_strategy_.get(), directory_bot_jid_)); log_to_server_.reset( - new LogToServer(host_, ServerLogEntry::ME2ME, signal_strategy_.get())); + new LogToServer(host_, ServerLogEntry::ME2ME, signal_strategy_.get(), + directory_bot_jid_)); host_event_logger_ = HostEventLogger::Create(host_, kApplicationName); resizing_host_observer_.reset( diff --git a/remoting/host/service_client.cc b/remoting/host/service_client.cc index 26e4eef..6db1c6e 100644 --- a/remoting/host/service_client.cc +++ b/remoting/host/service_client.cc @@ -13,21 +13,18 @@ #include "net/url_request/url_fetcher_delegate.h" #include "net/url_request/url_request_context_getter.h" -namespace { -const char kServiceUrl[] = - "https://www.googleapis.com/chromoting/v1/@me/hosts/"; -} // namespace - namespace remoting { class ServiceClient::Core : public base::RefCountedThreadSafe<ServiceClient::Core>, public net::URLFetcherDelegate { public: - Core(net::URLRequestContextGetter* request_context_getter) + Core(const std::string& chromoting_hosts_url, + net::URLRequestContextGetter* request_context_getter) : request_context_getter_(request_context_getter), delegate_(NULL), - pending_request_type_(PENDING_REQUEST_NONE) { + pending_request_type_(PENDING_REQUEST_NONE), + chromoting_hosts_url_(chromoting_hosts_url) { } void RegisterHost(const std::string& host_id, @@ -64,6 +61,7 @@ class ServiceClient::Core ServiceClient::Delegate* delegate_; scoped_ptr<net::URLFetcher> request_; PendingRequestType pending_request_type_; + std::string chromoting_hosts_url_; }; void ServiceClient::Core::RegisterHost( @@ -102,7 +100,7 @@ void ServiceClient::Core::MakeGaiaRequest( ServiceClient::Delegate* delegate) { delegate_ = delegate; request_.reset(net::URLFetcher::Create( - 0, GURL(kServiceUrl + url_suffix), request_type, this)); + 0, GURL(chromoting_hosts_url_ + url_suffix), request_type, this)); request_->SetRequestContext(request_context_getter_); request_->SetUploadData("application/json; charset=UTF-8", request_body); request_->AddExtraRequestHeader("Authorization: OAuth " + oauth_access_token); @@ -140,8 +138,9 @@ void ServiceClient::Core::HandleResponse(const net::URLFetcher* source) { delegate_->OnNetworkError(source->GetResponseCode()); } -ServiceClient::ServiceClient(net::URLRequestContextGetter* context_getter) { - core_ = new Core(context_getter); +ServiceClient::ServiceClient(const std::string& chromoting_hosts_url, + net::URLRequestContextGetter* context_getter) { + core_ = new Core(chromoting_hosts_url, context_getter); } ServiceClient::~ServiceClient() { diff --git a/remoting/host/service_client.h b/remoting/host/service_client.h index cb878d8..9085680 100644 --- a/remoting/host/service_client.h +++ b/remoting/host/service_client.h @@ -34,7 +34,8 @@ class ServiceClient { protected: virtual ~Delegate() {} }; - ServiceClient(net::URLRequestContextGetter* context_getter); + ServiceClient(const std::string& chromoting_hosts_url, + net::URLRequestContextGetter* context_getter); ~ServiceClient(); // Register a host. diff --git a/remoting/host/service_urls.cc b/remoting/host/service_urls.cc new file mode 100644 index 0000000..ea1d448 --- /dev/null +++ b/remoting/host/service_urls.cc @@ -0,0 +1,86 @@ +// Copyright (c) 2012 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. + +#include "remoting/host/service_urls.h" + +#include "base/command_line.h" +#include "base/logging.h" + +namespace { + +// Configurable service data. +const char kDirectoryBaseUrl[] = "https://www.googleapis.com/chromoting/v1"; +const char kXmppServerAddress[] = "talk.google.com:5222"; +const bool kXmppServerUseTls = true; +const char kDirectoryBotJid[] = "remoting@bot.talk.google.com"; + +// Command line switches. +const char kDirectoryBaseUrlSwitch[] = "directory-base-url"; +const char kXmppServerAddressSwitch[] = "xmpp-server-address"; +const char kXmppServerDisableTlsSwitch[] = "disable-xmpp-server-tls"; +const char kDirectoryBotJidSwitch[] = "directory-bot-jid"; + +// Non-configurable service paths. +const char kDirectoryHostsSuffix[] = "/@me/hosts/"; + +} // namespace + +namespace remoting { + +ServiceUrls::ServiceUrls() + : directory_base_url_(kDirectoryBaseUrl), + xmpp_server_address_(kXmppServerAddress), + xmpp_server_use_tls_(kXmppServerUseTls), + directory_bot_jid_(kDirectoryBotJid) { +#if !defined(NDEBUG) + // Allow debug builds to override urls via command line. + CommandLine* command_line = CommandLine::ForCurrentProcess(); + CHECK(command_line); + if (command_line->HasSwitch(kDirectoryBaseUrlSwitch)) { + directory_base_url_ = command_line->GetSwitchValueASCII( + kDirectoryBaseUrlSwitch); + } + directory_hosts_url_ = directory_base_url_ + kDirectoryHostsSuffix; + if (command_line->HasSwitch(kXmppServerAddressSwitch)) { + xmpp_server_address_ = command_line->GetSwitchValueASCII( + kXmppServerAddressSwitch); + } + if (command_line->HasSwitch(kXmppServerDisableTlsSwitch)) { + xmpp_server_use_tls_ = false; + } + if (command_line->HasSwitch(kDirectoryBotJidSwitch)) { + directory_bot_jid_ = command_line->GetSwitchValueASCII( + kDirectoryBotJidSwitch); + } +#endif // !defined(NDEBUG) +} + +ServiceUrls::~ServiceUrls() { +} + +ServiceUrls* remoting::ServiceUrls::GetInstance() { + return Singleton<ServiceUrls>::get(); +} + +const std::string& ServiceUrls::directory_base_url() const { + return directory_base_url_; +} + +const std::string& ServiceUrls::directory_hosts_url() const { + return directory_hosts_url_; +} + +const std::string& ServiceUrls::xmpp_server_address() const { + return xmpp_server_address_; +} + +bool ServiceUrls::xmpp_server_use_tls() const { + return xmpp_server_use_tls_; +} + +const std::string& ServiceUrls::directory_bot_jid() const { + return directory_bot_jid_; +} + +} // namespace remoting diff --git a/remoting/host/service_urls.h b/remoting/host/service_urls.h new file mode 100644 index 0000000..ed377a5 --- /dev/null +++ b/remoting/host/service_urls.h @@ -0,0 +1,51 @@ +// Copyright (c) 2012 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. + +#ifndef REMOTING_HOST_SERVICE_URLS_H_ +#define REMOTING_HOST_SERVICE_URLS_H_ + +#include <string> + +#include "base/basictypes.h" +#include "base/memory/singleton.h" + +namespace remoting { + +// This class contains the URLs to the services used by the host (except for +// Gaia, which has its own GaiaUrls class. In debug builds, it allows these URLs +// to be overriden by command line switches, allowing the host process to be +// pointed at alternate/test servers. +class ServiceUrls { + public: + static ServiceUrls* GetInstance(); + + // Remoting directory REST API URLs. + const std::string& directory_base_url() const; + const std::string& directory_hosts_url() const; + + // XMPP Server configuration. + const std::string& xmpp_server_address() const; + bool xmpp_server_use_tls() const; + + // Remoting directory bot JID (for registering hosts, logging, heartbeats). + const std::string& directory_bot_jid() const; + + private: + friend struct DefaultSingletonTraits<ServiceUrls>; + + ServiceUrls(); + virtual ~ServiceUrls(); + + std::string directory_base_url_; + std::string directory_hosts_url_; + std::string xmpp_server_address_; + bool xmpp_server_use_tls_; + std::string directory_bot_jid_; + + DISALLOW_COPY_AND_ASSIGN(ServiceUrls); +}; + +} // namespace remoting + +#endif // REMOTING_HOST_SERVICE_URLS_H_ diff --git a/remoting/host/setup/host_starter.cc b/remoting/host/setup/host_starter.cc index 4021ccb..13cb685 100644 --- a/remoting/host/setup/host_starter.cc +++ b/remoting/host/setup/host_starter.cc @@ -34,12 +34,15 @@ HostStarter::~HostStarter() { } scoped_ptr<HostStarter> HostStarter::Create( + const std::string& oauth2_token_url, + const std::string& chromoting_hosts_url, net::URLRequestContextGetter* url_request_context_getter) { scoped_ptr<gaia::GaiaOAuthClient> oauth_client( - new gaia::GaiaOAuthClient(gaia::kGaiaOAuth2Url, - url_request_context_getter)); + new gaia::GaiaOAuthClient( + oauth2_token_url, url_request_context_getter)); scoped_ptr<remoting::ServiceClient> service_client( - new remoting::ServiceClient(url_request_context_getter)); + new remoting::ServiceClient( + chromoting_hosts_url, url_request_context_getter)); scoped_ptr<remoting::DaemonController> daemon_controller( remoting::DaemonController::Create()); return scoped_ptr<HostStarter>( diff --git a/remoting/host/setup/host_starter.h b/remoting/host/setup/host_starter.h index b15e874..9d83e4c 100644 --- a/remoting/host/setup/host_starter.h +++ b/remoting/host/setup/host_starter.h @@ -33,6 +33,8 @@ class HostStarter : public gaia::GaiaOAuthClient::Delegate, // Creates a HostStarter. static scoped_ptr<HostStarter> Create( + const std::string& oauth2_token_url, + const std::string& chromoting_hosts_url, net::URLRequestContextGetter* url_request_context_getter); // Registers a new host with the Chromoting service, and starts it. diff --git a/remoting/host/setup/start_host.cc b/remoting/host/setup/start_host.cc index a089942..5257517 100644 --- a/remoting/host/setup/start_host.cc +++ b/remoting/host/setup/start_host.cc @@ -10,7 +10,9 @@ #include "base/run_loop.h" #include "base/stringprintf.h" #include "base/threading/thread.h" +#include "google_apis/gaia/gaia_urls.h" #include "net/url_request/url_request_context_getter.h" +#include "remoting/host/service_urls.h" #include "remoting/host/setup/host_starter.h" #include "remoting/host/setup/oauth_helper.h" #include "remoting/host/setup/pin_validator.h" @@ -153,7 +155,10 @@ int main(int argc, char** argv) { // Start the host. scoped_ptr<HostStarter> host_starter( - HostStarter::Create(url_request_context_getter)); + HostStarter::Create( + GaiaUrls::GetInstance()->oauth2_token_url(), + remoting::ServiceUrls::GetInstance()->directory_hosts_url(), + url_request_context_getter)); if (redirect_url.empty()) { redirect_url = remoting::GetDefaultOauthRedirectUrl(); } diff --git a/remoting/host/setup/win/start_host_window.cc b/remoting/host/setup/win/start_host_window.cc index 0a0bc17..2ae6a2f 100644 --- a/remoting/host/setup/win/start_host_window.cc +++ b/remoting/host/setup/win/start_host_window.cc @@ -11,6 +11,8 @@ #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "base/utf_string_conversions.h" +#include "google_apis/gaia/gaia_urls.h" +#include "remoting/host/service_urls.h" #include "remoting/host/setup/oauth_helper.h" #include "remoting/host/setup/pin_validator.h" #include "remoting/host/setup/win/load_string_from_resource.h" @@ -19,7 +21,10 @@ namespace remoting { StartHostWindow::StartHostWindow( scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) - : host_starter_(remoting::HostStarter::Create(url_request_context_getter)), + : host_starter_(remoting::HostStarter::Create( + GaiaUrls::GetInstance()->oauth2_token_url(), + remoting::ServiceUrls::GetInstance()->directory_hosts_url(), + url_request_context_getter)), consent_to_collect_data_(true), mem_mgr_(GetProcessHeap()), string_mgr_(&mem_mgr_), diff --git a/remoting/host/signaling_connector.cc b/remoting/host/signaling_connector.cc index 97d0eb1..eff6221 100644 --- a/remoting/host/signaling_connector.cc +++ b/remoting/host/signaling_connector.cc @@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/callback.h" +#include "google_apis/gaia/gaia_urls.h" #include "google_apis/google_api_keys.h" #include "net/url_request/url_fetcher.h" #include "net/url_request/url_request_context_getter.h" @@ -59,8 +60,9 @@ SignalingConnector::~SignalingConnector() { void SignalingConnector::EnableOAuth( scoped_ptr<OAuthCredentials> oauth_credentials) { oauth_credentials_ = oauth_credentials.Pass(); - gaia_oauth_client_.reset(new gaia::GaiaOAuthClient( - gaia::kGaiaOAuth2Url, url_request_context_getter_)); + gaia_oauth_client_.reset( + new gaia::GaiaOAuthClient(GaiaUrls::GetInstance()->oauth2_token_url(), + url_request_context_getter_)); } void SignalingConnector::OnSignalStrategyStateChange( diff --git a/remoting/jingle_glue/xmpp_signal_strategy.cc b/remoting/jingle_glue/xmpp_signal_strategy.cc index 03adcb8..51bbade 100644 --- a/remoting/jingle_glue/xmpp_signal_strategy.cc +++ b/remoting/jingle_glue/xmpp_signal_strategy.cc @@ -38,15 +38,20 @@ XmppSignalStrategy::XmppSignalStrategy( scoped_refptr<net::URLRequestContextGetter> request_context_getter, const std::string& username, const std::string& auth_token, - const std::string& auth_token_service) - : request_context_getter_(request_context_getter), - username_(username), - auth_token_(auth_token), - auth_token_service_(auth_token_service), - resource_name_(kDefaultResourceName), - xmpp_client_(NULL), - state_(DISCONNECTED), - error_(OK) { + const std::string& auth_token_service, + const XmppSignalStrategy::XmppServerConfig& xmpp_server_config) + : request_context_getter_(request_context_getter), + username_(username), + auth_token_(auth_token), + auth_token_service_(auth_token_service), + resource_name_(kDefaultResourceName), + xmpp_client_(NULL), + xmpp_server_config_(xmpp_server_config), + state_(DISCONNECTED), + error_(OK) { +#if defined(NDEBUG) + CHECK(xmpp_server_config_.use_tls); +#endif } XmppSignalStrategy::~XmppSignalStrategy() { @@ -70,10 +75,12 @@ void XmppSignalStrategy::Connect() { settings.set_user(login_jid.node()); settings.set_host(login_jid.domain()); settings.set_resource(resource_name_); - settings.set_use_tls(buzz::TLS_ENABLED); settings.set_token_service(auth_token_service_); settings.set_auth_token(buzz::AUTH_MECHANISM_GOOGLE_TOKEN, auth_token_); - settings.set_server(talk_base::SocketAddress("talk.google.com", 5222)); + settings.set_server(talk_base::SocketAddress( + xmpp_server_config_.host, xmpp_server_config_.port)); + settings.set_use_tls( + xmpp_server_config_.use_tls ? buzz::TLS_ENABLED : buzz::TLS_DISABLED); scoped_ptr<jingle_glue::XmppClientSocketFactory> socket_factory( new jingle_glue::XmppClientSocketFactory( diff --git a/remoting/jingle_glue/xmpp_signal_strategy.h b/remoting/jingle_glue/xmpp_signal_strategy.h index e18019e..88dcf5d 100644 --- a/remoting/jingle_glue/xmpp_signal_strategy.h +++ b/remoting/jingle_glue/xmpp_signal_strategy.h @@ -38,11 +38,19 @@ class XmppSignalStrategy : public base::NonThreadSafe, public buzz::XmppStanzaHandler, public sigslot::has_slots<> { public: + // XMPP Server configuration for XmppSignalStrategy. + struct XmppServerConfig { + std::string host; + int port; + bool use_tls; + }; + XmppSignalStrategy( scoped_refptr<net::URLRequestContextGetter> request_context_getter, const std::string& username, const std::string& auth_token, - const std::string& auth_token_service); + const std::string& auth_token_service, + const XmppServerConfig& xmpp_server_config); virtual ~XmppSignalStrategy(); // SignalStrategy interface. @@ -86,6 +94,7 @@ class XmppSignalStrategy : public base::NonThreadSafe, std::string resource_name_; scoped_ptr<talk_base::TaskRunner> task_runner_; buzz::XmppClient* xmpp_client_; + XmppServerConfig xmpp_server_config_; State state_; Error error_; diff --git a/remoting/remoting.gyp b/remoting/remoting.gyp index b5b817c..2e52e44 100644 --- a/remoting/remoting.gyp +++ b/remoting/remoting.gyp @@ -392,6 +392,8 @@ 'host/server_log_entry.h', 'host/service_client.cc', 'host/service_client.h', + 'host/service_urls.cc', + 'host/service_urls.h', 'host/session_manager_factory.cc', 'host/session_manager_factory.h', 'host/signaling_connector.cc', diff --git a/remoting/webapp/build-webapp.py b/remoting/webapp/build-webapp.py index 966ddb5..a59177f 100755 --- a/remoting/webapp/build-webapp.py +++ b/remoting/webapp/build-webapp.py @@ -55,6 +55,14 @@ def createZip(zip_path, directory): zip.close() +def replaceUrl(destination, url_name, url_value): + """Updates a URL in both plugin_settings.json and manifest.js.""" + findAndReplace(os.path.join(destination, 'plugin_settings.js'), + "'" + url_name + "'", "'" + url_value + "'") + findAndReplace(os.path.join(destination, 'manifest.json'), + url_name, url_value) + + def buildWebApp(buildtype, version, mimetype, destination, zip_path, plugin, files, locales, patches): """Does the main work of building the webapp directory and zipfile. @@ -183,26 +191,82 @@ def buildWebApp(buildtype, version, mimetype, destination, zip_path, plugin, 'HOST_PLUGIN_MIMETYPE', mimetype) + # Allow host names for google services/apis to be overriden via env vars. + oauth2AccountsHost = os.environ.get( + 'OAUTH2_ACCOUNTS_HOST', 'https://accounts.google.com') + oauth2ApiHost = os.environ.get( + 'OAUTH2_API_HOST', 'https://www.googleapis.com') + directoryApiHost = os.environ.get( + 'DIRECTORY_API_HOST', 'https://www.googleapis.com') + oauth2BaseUrl = oauth2AccountsHost + '/o/oauth2' + oauth2ApiBaseUrl = oauth2ApiHost + '/oauth2' + directoryApiBaseUrl = directoryApiHost + '/chromoting/v1' + replaceUrl(destination, 'OAUTH2_BASE_URL', oauth2BaseUrl) + replaceUrl(destination, 'OAUTH2_API_BASE_URL', oauth2ApiBaseUrl) + replaceUrl(destination, 'DIRECTORY_API_BASE_URL', directoryApiBaseUrl) + # Substitute hosts in the manifest's CSP list. + findAndReplace(os.path.join(destination, 'manifest.json'), + 'OAUTH2_ACCOUNTS_HOST', oauth2AccountsHost) + # Ensure we list the API host only once if it's the same for multiple APIs. + googleApiHosts = ' '.join(set([oauth2ApiHost, directoryApiHost])) + findAndReplace(os.path.join(destination, 'manifest.json'), + 'GOOGLE_API_HOSTS', googleApiHosts) + + # WCS and the OAuth trampoline are both hosted on talkgadget. Split them into + # separate suffix/prefix variables to allow for wildcards in manifest.json. + talkGadgetHostSuffix = os.environ.get( + 'TALK_GADGET_HOST_SUFFIX', 'talkgadget.google.com') + talkGadgetHostPrefix = os.environ.get( + 'TALK_GADGET_HOST_PREFIX', 'https://chromoting-client.') + oauth2RedirectHostPrefix = os.environ.get( + 'OAUTH2_REDIRECT_HOST_PREFIX', 'https://chromoting-oauth.') + + # Use a wildcard in the manifest.json host specs if the prefixes differ. + talkGadgetHostJs = talkGadgetHostPrefix + talkGadgetHostSuffix + talkGadgetBaseUrl = talkGadgetHostJs + '/talkgadget/' + if talkGadgetHostPrefix == oauth2RedirectHostPrefix: + talkGadgetHostJson = talkGadgetHostJs + else: + talkGadgetHostJson = 'https://*.' + talkGadgetHostSuffix + # Set the correct OAuth2 redirect URL. - scheme = 'https://' - urlSuffix = '.talkgadget.google.com/talkgadget/oauth/chrome-remote-desktop' - url = scheme + 'chromoting-oauth' + urlSuffix - urlPattern = scheme + '*' + urlSuffix - if (buildtype == 'Official'): - oauth2RedirectUrlJs = ( - "'" + url + "/rel/' + chrome.i18n.getMessage('@@extension_id')") - oauth2RedirectUrlJson = urlPattern + '/rel/*' + oauth2RedirectHostJs = oauth2RedirectHostPrefix + talkGadgetHostSuffix + oauth2RedirectHostJson = talkGadgetHostJson + oauth2RedirectPath = '/talkgadget/oauth/chrome-remote-desktop' + oauth2RedirectBaseUrlJs = oauth2RedirectHostJs + oauth2RedirectPath + oauth2RedirectBaseUrlJson = oauth2RedirectHostJson + oauth2RedirectPath + if buildtype == 'Official': + oauth2RedirectUrlJs = ("'" + oauth2RedirectBaseUrlJs + + "/rel/' + chrome.i18n.getMessage('@@extension_id')") + oauth2RedirectUrlJson = oauth2RedirectBaseUrlJson + '/rel/*' else: - oauth2RedirectUrlJs = "'" + url + "/dev'" - oauth2RedirectUrlJson = urlPattern + '/dev*' + oauth2RedirectUrlJs = "'" + oauth2RedirectBaseUrlJs + "/dev'" + oauth2RedirectUrlJson = oauth2RedirectBaseUrlJson + '/dev*' findAndReplace(os.path.join(destination, 'plugin_settings.js'), - "'OAUTH2_REDIRECT_URL'", - oauth2RedirectUrlJs) + "'TALK_GADGET_URL'", "'" + talkGadgetBaseUrl + "'") + findAndReplace(os.path.join(destination, 'plugin_settings.js'), + "'OAUTH2_REDIRECT_URL'", oauth2RedirectUrlJs) + findAndReplace(os.path.join(destination, 'manifest.json'), + 'TALK_GADGET_HOST', talkGadgetHostJson) findAndReplace(os.path.join(destination, 'manifest.json'), - "OAUTH2_REDIRECT_URL", - oauth2RedirectUrlJson) + 'OAUTH2_REDIRECT_URL', oauth2RedirectUrlJson) + + # Configure xmpp server and directory bot settings in the plugin. + xmppServerAddress = os.environ.get( + 'XMPP_SERVER_ADDRESS', 'talk.google.com:5222') + xmppServerUseTls = os.environ.get('XMPP_SERVER_USE_TLS', 'true') + directoryBotJid = os.environ.get( + 'DIRECTORY_BOT_JID', 'remoting@bot.talk.google.com') + + findAndReplace(os.path.join(destination, 'plugin_settings.js'), + "'XMPP_SERVER_ADDRESS'", "'" + xmppServerAddress + "'") + findAndReplace(os.path.join(destination, 'plugin_settings.js'), + "Boolean('XMPP_SERVER_USE_TLS')", xmppServerUseTls) + findAndReplace(os.path.join(destination, 'plugin_settings.js'), + "'DIRECTORY_BOT_JID'", "'" + directoryBotJid + "'") # Set the correct API keys. + # For overriding the client ID/secret via env vars, see google_api_keys.py. apiClientId = google_api_keys.GetClientID('REMOTING') apiClientSecret = google_api_keys.GetClientSecret('REMOTING') diff --git a/remoting/webapp/client_screen.js b/remoting/webapp/client_screen.js index 97bf94e..e9fd315 100644 --- a/remoting/webapp/client_screen.js +++ b/remoting/webapp/client_screen.js @@ -437,7 +437,7 @@ function resolveSupportId(clientJid, supportId, token) { }; remoting.supportHostsXhr_ = remoting.xhr.get( - 'https://www.googleapis.com/chromoting/v1/support-hosts/' + + remoting.settings.DIRECTORY_API_BASE_URL + '/support-hosts/' + encodeURIComponent(supportId), parseServerResponse_.bind(null, clientJid), '', diff --git a/remoting/webapp/format_iq.js b/remoting/webapp/format_iq.js index 8690718..6fb8e55 100644 --- a/remoting/webapp/format_iq.js +++ b/remoting/webapp/format_iq.js @@ -21,13 +21,6 @@ remoting.FormatIq = function() { }; /** - * JID for the remoting bot which is used to bridge communication between - * the Talk network and the Remoting directory service. - */ -remoting.FormatIq.prototype.REMOTING_DIRECTORY_SERVICE_BOT = - 'remoting@bot.talk.google.com'; - -/** * Verify that the only attributes on the given |node| are those specified * in the |attrs| string. * @@ -628,7 +621,7 @@ remoting.FormatIq.prototype.prettyIq = function(send, message) { var to = iq.getAttribute('to'); var from = iq.getAttribute('from'); var action = ''; - var bot = remoting.FormatIq.prototype.REMOTING_DIRECTORY_SERVICE_BOT; + var bot = remoting.settings.DIRECTORY_BOT_JID; if (send) { if (to && to != this.hostJid && to != bot) { console.warn('FormatIq: bad to: ' + to); diff --git a/remoting/webapp/host_controller.js b/remoting/webapp/host_controller.js index 5f04bce..4612ee6 100644 --- a/remoting/webapp/host_controller.js +++ b/remoting/webapp/host_controller.js @@ -180,7 +180,7 @@ remoting.HostController.prototype.start = function(hostPin, consent, callback) { publicKey: publicKey } }; remoting.xhr.post( - 'https://www.googleapis.com/chromoting/v1/@me/hosts/', + remoting.settings.DIRECTORY_API_BASE_URL + '/@me/hosts/', /** @param {XMLHttpRequest} xhr */ function (xhr) { onRegistered(publicKey, privateKey, xhr); }, JSON.stringify(newHostDetails), diff --git a/remoting/webapp/host_list.js b/remoting/webapp/host_list.js index 4c4c065..3f38363 100644 --- a/remoting/webapp/host_list.js +++ b/remoting/webapp/host_list.js @@ -133,7 +133,7 @@ remoting.HostList.prototype.refresh = function(onDone) { var getHosts = function(token) { var headers = { 'Authorization': 'OAuth ' + token }; remoting.xhr.get( - 'https://www.googleapis.com/chromoting/v1/@me/hosts', + remoting.settings.DIRECTORY_API_BASE_URL + '/@me/hosts', parseHostListResponse, '', headers); }; /** @param {remoting.Error} error */ @@ -303,7 +303,7 @@ remoting.HostList.prototype.renameHost_ = function(hostTableEntry) { publicKey: hostTableEntry.host.publicKey } }; remoting.xhr.put( - 'https://www.googleapis.com/chromoting/v1/@me/hosts/' + + remoting.settings.DIRECTORY_API_BASE_URL + '/@me/hosts/' + hostTableEntry.host.hostId, function(xhr) {}, JSON.stringify(newHostDetails), @@ -325,7 +325,7 @@ remoting.HostList.unregisterHostById = function(hostId) { var deleteHost = function(token) { var headers = { 'Authorization': 'OAuth ' + token }; remoting.xhr.remove( - 'https://www.googleapis.com/chromoting/v1/@me/hosts/' + hostId, + remoting.settings.DIRECTORY_API_BASE_URL + '/@me/hosts/' + hostId, function() {}, '', headers); } remoting.identity.callWithToken(deleteHost, remoting.showErrorMessage); diff --git a/remoting/webapp/host_plugin_proto.js b/remoting/webapp/host_plugin_proto.js index f845965..fd4255e 100644 --- a/remoting/webapp/host_plugin_proto.js +++ b/remoting/webapp/host_plugin_proto.js @@ -100,3 +100,7 @@ remoting.HostPlugin.prototype.daemonState; /** @type {function(boolean):void} */ remoting.HostPlugin.prototype.onNatTraversalPolicyChanged; + +/** @type {string} */ remoting.HostPlugin.prototype.xmppServerAddress; +/** @type {boolean} */ remoting.HostPlugin.prototype.xmppServerUseTls; +/** @type {string} */ remoting.HostPlugin.prototype.directoryBotJid;
\ No newline at end of file diff --git a/remoting/webapp/host_session.js b/remoting/webapp/host_session.js index 8c25a8f0..72007a3 100644 --- a/remoting/webapp/host_session.js +++ b/remoting/webapp/host_session.js @@ -46,7 +46,7 @@ remoting.HostSession.State = { */ remoting.HostSession.createPlugin = function() { var plugin = document.createElement('embed'); - plugin.type = remoting.PLUGIN_MIMETYPE; + plugin.type = remoting.settings.PLUGIN_MIMETYPE; // Hiding the plugin means it doesn't load, so make it size zero instead. plugin.width = 0; plugin.height = 0; @@ -74,6 +74,9 @@ remoting.HostSession.prototype.createPluginAndConnect = this.plugin.onStateChanged = onStateChanged; this.plugin.logDebugInfo = logDebugInfo; this.plugin.localize(chrome.i18n.getMessage); + this.plugin.xmppServerAddress = remoting.settings.XMPP_SERVER_ADDRESS; + this.plugin.xmppServerUseTls = remoting.settings.XMPP_SERVER_USE_TLS; + this.plugin.directoryBotJid = remoting.settings.DIRECTORY_BOT_JID; this.plugin.connect(email, 'oauth2:' + accessToken); }; diff --git a/remoting/webapp/log_to_server.js b/remoting/webapp/log_to_server.js index ff104d3..85e2c90 100644 --- a/remoting/webapp/log_to_server.js +++ b/remoting/webapp/log_to_server.js @@ -167,7 +167,8 @@ remoting.LogToServer.prototype.log = function(entry) { console.log('Sending ' + this.pendingEntries.length + ' log ' + ((this.pendingEntries.length == 1) ? 'entry' : 'entries') + ' to the server.'); - var stanza = '<cli:iq to="remoting@bot.talk.google.com" type="set" ' + + var stanza = '<cli:iq to="' + + remoting.settings.DIRECTORY_BOT_JID + '" type="set" ' + 'xmlns:cli="jabber:client"><gr:log xmlns:gr="google:remoting">'; while (this.pendingEntries.length > 0) { stanza += /** @type string */ this.pendingEntries.shift(); diff --git a/remoting/webapp/manifest.json b/remoting/webapp/manifest.json index a52b1da..0ed8b52 100644 --- a/remoting/webapp/manifest.json +++ b/remoting/webapp/manifest.json @@ -22,11 +22,12 @@ "js": [ "cs_oauth2_trampoline.js" ] } ], - "content_security_policy": "default-src 'self'; script-src 'self' https://*.talkgadget.google.com; style-src 'self' https://fonts.googleapis.com; img-src 'self' https://*.talkgadget.google.com; font-src *; connect-src 'self' https://accounts.google.com https://www.googleapis.com https://*.talkgadget.google.com https://relay.google.com", + "content_security_policy": "default-src 'self'; script-src 'self' TALK_GADGET_HOST; style-src 'self' https://fonts.googleapis.com; img-src 'self' TALK_GADGET_HOST; font-src *; connect-src 'self' OAUTH2_ACCOUNTS_HOST GOOGLE_API_HOSTS TALK_GADGET_HOST https://relay.google.com", "permissions": [ - "https://accounts.google.com/*", - "https://www.googleapis.com/chromoting/*", - "https://*.talkgadget.google.com/talkgadget/*", + "OAUTH2_ACCOUNTS_HOST/*", + "OAUTH2_API_BASE_URL/*", + "DIRECTORY_API_BASE_URL/*", + "TALK_GADGET_HOST/talkgadget/*", "https://relay.google.com/*", "clipboardRead", "clipboardWrite" diff --git a/remoting/webapp/oauth2.js b/remoting/webapp/oauth2.js index f6594cf..752c880 100644 --- a/remoting/webapp/oauth2.js +++ b/remoting/webapp/oauth2.js @@ -46,12 +46,56 @@ remoting.OAuth2.prototype.SCOPE_ = 'https://www.googleapis.com/auth/chromoting ' + 'https://www.googleapis.com/auth/googletalk ' + 'https://www.googleapis.com/auth/userinfo#email'; -/** @private */ -remoting.OAuth2.prototype.OAUTH2_TOKEN_ENDPOINT_ = - 'https://accounts.google.com/o/oauth2/token'; -/** @private */ -remoting.OAuth2.prototype.OAUTH2_REVOKE_TOKEN_ENDPOINT_ = - 'https://accounts.google.com/o/oauth2/revoke'; + +// Configurable URLs/strings. +/** @private + * @return {string} OAuth2 redirect URI. + */ +remoting.OAuth2.prototype.getRedirectUri_ = function() { + return remoting.settings.OAUTH2_REDIRECT_URL; +}; + +/** @private + * @return {string} API client ID. + */ +remoting.OAuth2.prototype.getClientId_ = function() { + return remoting.settings.OAUTH2_CLIENT_ID; +}; + +/** @private + * @return {string} API client secret. + */ +remoting.OAuth2.prototype.getClientSecret_ = function() { + return remoting.settings.OAUTH2_CLIENT_SECRET; +}; + +/** @private + * @return {string} OAuth2 authentication URL. + */ +remoting.OAuth2.prototype.getOAuth2AuthEndpoint_ = function() { + return remoting.settings.OAUTH2_BASE_URL + '/auth'; +}; + +/** @private + * @return {string} OAuth2 token URL. + */ +remoting.OAuth2.prototype.getOAuth2TokenEndpoint_ = function() { + return remoting.settings.OAUTH2_BASE_URL + '/token'; +}; + +/** @private + * @return {string} OAuth token revocation URL. + */ +remoting.OAuth2.prototype.getOAuth2RevokeTokenEndpoint_ = function() { + return remoting.settings.OAUTH2_BASE_URL + '/revoke'; +}; + +/** @private + * @return {string} OAuth2 userinfo API URL. + */ +remoting.OAuth2.prototype.getOAuth2ApiUserInfoEndpoint_ = function() { + return remoting.settings.OAUTH2_API_BASE_URL + '/v1/userinfo'; +}; /** @return {boolean} True if the app is already authenticated. */ remoting.OAuth2.prototype.isAuthenticated = function() { @@ -252,13 +296,13 @@ remoting.OAuth2.prototype.refreshAccessToken_ = function(onDone) { } var parameters = { - 'client_id': this.CLIENT_ID_, - 'client_secret': this.CLIENT_SECRET_, + 'client_id': this.getClientId_(), + 'client_secret': this.getClientSecret_(), 'refresh_token': this.getRefreshToken_(), 'grant_type': 'refresh_token' }; - remoting.xhr.post(this.OAUTH2_TOKEN_ENDPOINT_, + remoting.xhr.post(this.getOAuth2TokenEndpoint_(), this.processTokenResponse_.bind(this, onDone), parameters); }; @@ -281,10 +325,10 @@ remoting.OAuth2.prototype.generateXsrfToken_ = function() { remoting.OAuth2.prototype.doAuthRedirect = function() { var xsrf_token = this.generateXsrfToken_(); window.localStorage.setItem(this.KEY_XSRF_TOKEN_, xsrf_token); - var GET_CODE_URL = 'https://accounts.google.com/o/oauth2/auth?' + + var GET_CODE_URL = this.getOAuth2AuthEndpoint_() + '?' + remoting.xhr.urlencodeParamHash({ - 'client_id': this.CLIENT_ID_, - 'redirect_uri': this.REDIRECT_URI_, + 'client_id': this.getClientId_(), + 'redirect_uri': this.getRedirectUri_(), 'scope': this.SCOPE_, 'state': xsrf_token, 'response_type': 'code', @@ -311,13 +355,13 @@ remoting.OAuth2.prototype.exchangeCodeForToken = function(code, state, onDone) { onDone(null); } var parameters = { - 'client_id': this.CLIENT_ID_, - 'client_secret': this.CLIENT_SECRET_, - 'redirect_uri': this.REDIRECT_URI_, + 'client_id': this.getClientId_(), + 'client_secret': this.getClientSecret_(), + 'redirect_uri': this.getRedirectUri_(), 'code': code, 'grant_type': 'authorization_code' }; - remoting.xhr.post(this.OAUTH2_TOKEN_ENDPOINT_, + remoting.xhr.post(this.getOAuth2TokenEndpoint_(), this.processTokenResponse_.bind(this, onDone), parameters); }; @@ -365,7 +409,7 @@ remoting.OAuth2.prototype.revokeToken_ = function(token) { ' ; response: ' + xhr.responseText + ' ; xhr: ', xhr); } }; - remoting.xhr.post(this.OAUTH2_REVOKE_TOKEN_ENDPOINT_, + remoting.xhr.post(this.getOAuth2RevokeTokenEndpoint_(), processResponse, parameters); }; @@ -466,7 +510,7 @@ remoting.OAuth2.prototype.getEmail = function(onOk, onError) { /** @param {string} token The access token. */ var getEmailFromToken = function(token) { var headers = { 'Authorization': 'OAuth ' + token }; - remoting.xhr.get('https://www.googleapis.com/oauth2/v1/userinfo', + remoting.xhr.get(that.getOAuth2ApiUserInfoEndpoint_(), onResponse, '', headers); }; diff --git a/remoting/webapp/oauth2_callback.js b/remoting/webapp/oauth2_callback.js index 6d94dca..3517935 100644 --- a/remoting/webapp/oauth2_callback.js +++ b/remoting/webapp/oauth2_callback.js @@ -13,6 +13,8 @@ 'use strict'; +var remoting = remoting || {}; + function retrieveRefreshToken() { var query = window.location.search.substring(1); var parts = query.split('&'); @@ -23,6 +25,7 @@ function retrieveRefreshToken() { } if ('code' in queryArgs && 'state' in queryArgs) { + remoting.settings = new remoting.Settings(); var oauth2 = new remoting.OAuth2(); oauth2.exchangeCodeForToken(queryArgs['code'], queryArgs['state'], function() { diff --git a/remoting/webapp/plugin_settings.js b/remoting/webapp/plugin_settings.js index d3fde9a..8ca53be 100644 --- a/remoting/webapp/plugin_settings.js +++ b/remoting/webapp/plugin_settings.js @@ -6,22 +6,43 @@ // Keeping all that centralized here allows us to use symlinks for the other // files making for a faster compile/run cycle when only modifying HTML/JS. +'use strict'; + /** @suppress {duplicate} */ var remoting = remoting || {}; -/** - * @type {string} The MIME type of the Host plugin. - */ -remoting.PLUGIN_MIMETYPE = 'HOST_PLUGIN_MIMETYPE'; - -/** - * @type {string} The OAuth2 redirect URL. - * @private - */ -remoting.OAuth2.prototype.REDIRECT_URI_ = 'OAUTH2_REDIRECT_URL'; - -// Constants for parameters used in retrieving the OAuth2 credentials. -/** @private */ -remoting.OAuth2.prototype.CLIENT_ID_ = 'API_CLIENT_ID'; -/** @private */ -remoting.OAuth2.prototype.CLIENT_SECRET_ = 'API_CLIENT_SECRET'; +/** @type {remoting.Settings} */ +remoting.settings = null; +/** @constructor */ +remoting.Settings = function() {}; + +// The settings on this file are automatically substituted by build-webapp.py. +// Do not override them manually, except for running local tests. + +/** @type {string} MIME type for the host plugin.*/ +remoting.Settings.prototype.PLUGIN_MIMETYPE = 'HOST_PLUGIN_MIMETYPE'; +/** @type {string} API client ID.*/ +remoting.Settings.prototype.OAUTH2_CLIENT_ID = 'API_CLIENT_ID'; +/** @type {string} API client secret.*/ +remoting.Settings.prototype.OAUTH2_CLIENT_SECRET = 'API_CLIENT_SECRET'; + +/** @type {string} Base URL for OAuth2 authentication. */ +remoting.Settings.prototype.OAUTH2_BASE_URL = 'OAUTH2_BASE_URL'; +/** @type {string} Base URL for the OAuth2 API. */ +remoting.Settings.prototype.OAUTH2_API_BASE_URL = 'OAUTH2_API_BASE_URL'; +/** @type {string} Base URL for the Remoting Directory REST API. */ +remoting.Settings.prototype.DIRECTORY_API_BASE_URL = 'DIRECTORY_API_BASE_URL'; +/** @type {string} URL for the talk gadget web service. */ +remoting.Settings.prototype.TALK_GADGET_URL = 'TALK_GADGET_URL'; +/** @type {string} OAuth2 redirect URI. */ +remoting.Settings.prototype.OAUTH2_REDIRECT_URL = 'OAUTH2_REDIRECT_URL'; + +/** @type {string} XMPP JID for the remoting directory server bot. */ +remoting.Settings.prototype.DIRECTORY_BOT_JID = 'DIRECTORY_BOT_JID'; + +// XMPP server connection settings. +/** @type {string} XMPP server host name (or IP address) and port. */ +remoting.Settings.prototype.XMPP_SERVER_ADDRESS = 'XMPP_SERVER_ADDRESS'; +/** @type {boolean} Whether to use TLS on connections to the XMPP server. */ +remoting.Settings.prototype.XMPP_SERVER_USE_TLS = + Boolean('XMPP_SERVER_USE_TLS'); diff --git a/remoting/webapp/remoting.js b/remoting/webapp/remoting.js index f5d1fe1..8ffc477 100644 --- a/remoting/webapp/remoting.js +++ b/remoting/webapp/remoting.js @@ -41,6 +41,7 @@ remoting.init = function() { remoting.logExtensionInfoAsync_(); l10n.localize(); // Create global objects. + remoting.settings = new remoting.Settings(); remoting.oauth2 = new remoting.OAuth2(); // TODO(jamiewalch): Reinstate this when we migrate to apps v2 // (http://crbug.com/ 134213). diff --git a/remoting/webapp/wcs_loader.js b/remoting/webapp/wcs_loader.js index 8befcc4..3ab10bf 100644 --- a/remoting/webapp/wcs_loader.js +++ b/remoting/webapp/wcs_loader.js @@ -30,14 +30,6 @@ remoting.WcsLoader = function() { }; /** - * The URL of the GTalk gadget. - * @type {string} - * @private - */ -remoting.WcsLoader.prototype.TALK_GADGET_URL_ = - 'https://chromoting-client.talkgadget.google.com/talkgadget/'; - -/** * The id of the script node. * @type {string} * @private @@ -69,7 +61,7 @@ remoting.WcsLoader.prototype.start = function(token, onReady, onError) { // Create a script node to load the WCS driver. node = document.createElement('script'); node.id = this.SCRIPT_NODE_ID_; - node.src = this.TALK_GADGET_URL_ + 'iq?access_token=' + token; + node.src = remoting.settings.TALK_GADGET_URL + 'iq?access_token=' + token; node.type = 'text/javascript'; document.body.insertBefore(node, document.body.firstChild); @@ -114,10 +106,6 @@ remoting.WcsLoader.prototype.constructWcs_ = function(token, onReady) { remoting.wcsLoader.wcsIqClient, token, onReady); }; -/** @private */ -remoting.WcsLoader.prototype.OAUTH2_VALIDATE_TOKEN_ENDPOINT_ = - 'https://www.googleapis.com/oauth2/v1/tokeninfo'; - /** * Validates an OAuth2 access token. * @@ -151,6 +139,8 @@ remoting.WcsLoader.prototype.validateToken = function(token, onOk, onError) { } }; var parameters = '?access_token=' + encodeURIComponent(token); - xhr.open('GET', this.OAUTH2_VALIDATE_TOKEN_ENDPOINT_ + parameters, true); + xhr.open('GET', + remoting.settings.OAUTH2_API_BASE_URL + '/v1/tokeninfo' + parameters, + true); xhr.send(null); }; diff --git a/remoting/webapp/wcs_sandbox.html b/remoting/webapp/wcs_sandbox.html index a84ef17..b768d05 100644 --- a/remoting/webapp/wcs_sandbox.html +++ b/remoting/webapp/wcs_sandbox.html @@ -9,6 +9,7 @@ found in the LICENSE file. <head> <meta charset="utf-8"> <script src="error.js"></script> + <script src="plugin_settings.js"></script> <script src="xhr_proxy.js"></script> <script src="wcs.js"></script> <script src="wcs_loader.js"></script> diff --git a/remoting/webapp/wcs_sandbox_content.js b/remoting/webapp/wcs_sandbox_content.js index c297900..b97f6a4 100644 --- a/remoting/webapp/wcs_sandbox_content.js +++ b/remoting/webapp/wcs_sandbox_content.js @@ -213,6 +213,7 @@ function onSandboxInit() { oldAEL(type, listener, useCapture); }; + remoting.settings = new remoting.Settings(); remoting.sandboxContent = new remoting.WcsSandboxContent(); } |