summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrmsousa@chromium.org <rmsousa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 07:31:05 +0000
committerrmsousa@chromium.org <rmsousa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 07:31:05 +0000
commit6583ed607fba49f241d8fe260b8927d3269910a0 (patch)
tree1ab3673acef4481d23fc7e50bbe3992fb86b0d5e
parent6a7c000f9841e3011d428ddc94b15a3fa2904325 (diff)
downloadchromium_src-6583ed607fba49f241d8fe260b8927d3269910a0.zip
chromium_src-6583ed607fba49f241d8fe260b8927d3269910a0.tar.gz
chromium_src-6583ed607fba49f241d8fe260b8927d3269910a0.tar.bz2
Make host/url references configurable.
In C++, they're all passed as optional command line parameters (like google_apis/gaia already allows us to do with the gaia oauth urls). So one can start the host with a monstrosity such as: out/Debug/remoting_me2me_host out/Debug/remoting_start_host --gaia-host=accounts.google.com --oauth-user-info-url=https://www.googleapis.com/oauth2/v1/userinfo --chromoting-bot-jid=remoting@bot.talk.google.com --chromoting-base-url=https://www.googleapis.com/chromoting/v1 --talk-server-host=talk.google.com --talk-server-port=5222 -[-disable-talk-server-tls] --oauth2-token-url=https://accounts.google.com/o/oauth2/token In Javascript and IT2Me, unfortunately we don't have a command line, so instead we put all these settings in plugin_settings.js, and the javascript passes them all into the it2me plugin as appropriate. They can then be changed by manually hacking plugin_settings.js and manifest.json in the build output, changing the remoting.settings object at runtime (although any new hosts you configure that are not in the manifest's CSP won't work), or, preferrably, by passing them via environment variables to the build, and letting build-webapp.py do its magic - for example, like with this: GOOGLE_CLIENT_ID_REMOTING=<clientid> GOOGLE_CLIENT_SECRET_REMOTING=<secret> OAUTH2_ACCOUNTS_HOST=https://accounts.google.com OAUTH2_API_HOST=https://www.googleapis.com CHROMOTING_BOT_JID=remoting@bot.talk.google.com CHROMOTING_API_HOST=https://www.googleapis.com TALK_SERVER_HOST=talk.google.com TALK_SERVER_PORT=5222 TALK_SERVER_USE_TLS=true TALK_GADGET_HOST_SUFFIX=talkgadget.google.com OAUTH2_REDIRECT_HOST_PREFIX=https://chromoting-oauth. TALK_GADGET_HOST_PREFIX=https://chromoting-client. ninja -C out/Debug remoting_webapp I've tested with me2me (host and client) and it2me (share and access), and verified both that the defaults work as before (without command line parameters), and that I can substitute test server hostnames in all of those parameters. BUG= Review URL: https://chromiumcodereview.appspot.com/11346040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180622 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--remoting/base/constants.cc2
-rw-r--r--remoting/base/constants.h2
-rw-r--r--remoting/host/heartbeat_sender.cc8
-rw-r--r--remoting/host/heartbeat_sender.h4
-rw-r--r--remoting/host/heartbeat_sender_unittest.cc7
-rw-r--r--remoting/host/host_change_notification_listener.cc6
-rw-r--r--remoting/host/host_change_notification_listener.h4
-rw-r--r--remoting/host/host_change_notification_listener_unittest.cc11
-rw-r--r--remoting/host/log_to_server.cc8
-rw-r--r--remoting/host/log_to_server.h5
-rw-r--r--remoting/host/log_to_server_unittest.cc4
-rw-r--r--remoting/host/plugin/host_plugin.cc3
-rw-r--r--remoting/host/plugin/host_script_object.cc98
-rw-r--r--remoting/host/plugin/host_script_object.h7
-rw-r--r--remoting/host/register_support_host_request.cc4
-rw-r--r--remoting/host/register_support_host_request.h2
-rw-r--r--remoting/host/register_support_host_request_unittest.cc6
-rw-r--r--remoting/host/remoting_me2me_host.cc25
-rw-r--r--remoting/host/service_client.cc19
-rw-r--r--remoting/host/service_client.h3
-rw-r--r--remoting/host/service_urls.cc86
-rw-r--r--remoting/host/service_urls.h51
-rw-r--r--remoting/host/setup/host_starter.cc9
-rw-r--r--remoting/host/setup/host_starter.h2
-rw-r--r--remoting/host/setup/start_host.cc7
-rw-r--r--remoting/host/setup/win/start_host_window.cc7
-rw-r--r--remoting/host/signaling_connector.cc6
-rw-r--r--remoting/jingle_glue/xmpp_signal_strategy.cc29
-rw-r--r--remoting/jingle_glue/xmpp_signal_strategy.h11
-rw-r--r--remoting/remoting.gyp2
-rwxr-xr-xremoting/webapp/build-webapp.py92
-rw-r--r--remoting/webapp/client_screen.js2
-rw-r--r--remoting/webapp/format_iq.js9
-rw-r--r--remoting/webapp/host_controller.js2
-rw-r--r--remoting/webapp/host_list.js6
-rw-r--r--remoting/webapp/host_plugin_proto.js4
-rw-r--r--remoting/webapp/host_session.js5
-rw-r--r--remoting/webapp/log_to_server.js3
-rw-r--r--remoting/webapp/manifest.json9
-rw-r--r--remoting/webapp/oauth2.js80
-rw-r--r--remoting/webapp/oauth2_callback.js3
-rw-r--r--remoting/webapp/plugin_settings.js53
-rw-r--r--remoting/webapp/remoting.js1
-rw-r--r--remoting/webapp/wcs_loader.js18
-rw-r--r--remoting/webapp/wcs_sandbox.html1
-rw-r--r--remoting/webapp/wcs_sandbox_content.js1
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();
}