Index: remoting/host/plugin/host_script_object.cc |
diff --git a/remoting/host/plugin/host_script_object.cc b/remoting/host/plugin/host_script_object.cc |
index de067551234ef7e53a4351c236206955c704cf8e..5ebe5fd05fb7f21c55e53faa3b2dfda1016306f8 100644 |
--- a/remoting/host/plugin/host_script_object.cc |
+++ b/remoting/host/plugin/host_script_object.cc |
@@ -78,6 +78,14 @@ const int kMaxLoginAttempts = 5; |
// more than 2 threads. |
const int kMaxWorkerPoolThreads = 2; |
+// Whether a given string ends with a given suffix. |
+bool EndsWith(std::string s, std::string suffix) { |
Sergey Ulanov
2012/07/31 20:59:53
reuse base::EndsWith()?
simonmorris
2012/07/31 23:16:10
Done.
|
+ if (s.length() < suffix.length()) { |
+ return false; |
+ } |
+ return s.compare(s.length() - suffix.length(), suffix.length(), suffix) == 0; |
+} |
+ |
} // namespace |
HostNPScriptObject::HostNPScriptObject( |
@@ -542,6 +550,13 @@ void HostNPScriptObject::FinishConnectNetworkThread( |
return; |
} |
+ // Check the host domain policy. |
+ if (!host_domain_.empty() && |
+ !EndsWith(uid, std::string("@") + host_domain_)) { |
+ SetState(kError); |
+ return; |
+ } |
+ |
// Verify that DesktopEnvironment has been created. |
if (desktop_environment_.get() == NULL) { |
SetState(kError); |
@@ -876,11 +891,14 @@ void HostNPScriptObject::DisconnectInternal() { |
return; |
default: |
- DCHECK(host_); |
SetState(kDisconnecting); |
+ if (!host_) { |
+ OnShutdownFinished(); |
+ return; |
+ } |
// ChromotingHost::Shutdown() may destroy SignalStrategy |
- // synchronously, bug SignalStrategy::Listener handlers are not |
+ // synchronously, but SignalStrategy::Listener handlers are not |
// allowed to destroy SignalStrategy, so post task to call |
// Shutdown() later. |
host_context_->network_task_runner()->PostTask( |
@@ -888,6 +906,7 @@ void HostNPScriptObject::DisconnectInternal() { |
&ChromotingHost::Shutdown, host_, |
base::Bind(&HostNPScriptObject::OnShutdownFinished, |
base::Unretained(this)))); |
+ return; |
} |
} |
@@ -908,22 +927,26 @@ void HostNPScriptObject::OnPolicyUpdate( |
} |
bool bool_value; |
+ std::string string_value; |
Sergey Ulanov
2012/07/31 20:59:53
move this below to where it's used. Also use a bet
simonmorris
2012/07/31 23:16:10
Done.
|
if (policies->GetBoolean(policy_hack::PolicyWatcher::kNatPolicyName, |
&bool_value)) { |
- OnNatPolicyUpdate(bool_value); |
+ UpdateNatPolicy(bool_value); |
+ } |
+ if (policies->GetString(policy_hack::PolicyWatcher::kHostDomainPolicyName, |
Sergey Ulanov
2012/07/31 20:59:53
We always expect this value to be present - DCHECK
simonmorris
2012/07/31 23:16:10
PolicyWatcher only emits changed policy values, so
|
+ &string_value)) { |
+ UpdateHostDomainPolicy(string_value); |
} |
-} |
-void HostNPScriptObject::OnNatPolicyUpdate(bool nat_traversal_enabled) { |
- if (!host_context_->network_task_runner()->BelongsToCurrentThread()) { |
- host_context_->network_task_runner()->PostTask( |
- FROM_HERE, |
- base::Bind(&HostNPScriptObject::OnNatPolicyUpdate, |
- base::Unretained(this), nat_traversal_enabled)); |
- return; |
+ if (!pending_connect_.is_null()) { |
+ pending_connect_.Run(); |
+ pending_connect_.Reset(); |
} |
+} |
- VLOG(2) << "OnNatPolicyUpdate: " << nat_traversal_enabled; |
+void HostNPScriptObject::UpdateNatPolicy(bool nat_traversal_enabled) { |
+ DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
+ |
+ VLOG(2) << "UpdateNatPolicy: " << nat_traversal_enabled; |
// When transitioning from enabled to disabled, force disconnect any |
// existing session. |
@@ -938,11 +961,20 @@ void HostNPScriptObject::OnNatPolicyUpdate(bool nat_traversal_enabled) { |
} |
UpdateWebappNatPolicy(nat_traversal_enabled_); |
+} |
- if (!pending_connect_.is_null()) { |
- pending_connect_.Run(); |
- pending_connect_.Reset(); |
+void HostNPScriptObject::UpdateHostDomainPolicy( |
+ const std::string& host_domain) { |
+ DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread()); |
+ |
+ VLOG(2) << "UpdateHostDomainPolicy: " << host_domain; |
+ |
+ // When setting a host domain policy, force disconnect any existing session. |
+ if (!host_domain.empty() && state_ != kStarting) { |
Sergey Ulanov
2012/07/31 20:59:53
hm. This will disconnect all connection even when
simonmorris
2012/07/31 23:16:10
If the domain hasn't changed, the PolicyWatcher wo
|
+ DisconnectInternal(); |
} |
+ |
+ host_domain_ = host_domain; |
} |
void HostNPScriptObject::OnReceivedSupportID( |