Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Side by Side Diff: remoting/host/remoting_me2me_host.cc

Issue 10829306: Make curtain-mode controllable by policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added missing ifdef. Removed unnecessary change. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // This file implements a standalone host process for Me2Me. 5 // This file implements a standalone host process for Me2Me.
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/at_exit.h" 9 #include "base/at_exit.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #include "remoting/host/network_settings.h" 43 #include "remoting/host/network_settings.h"
44 #include "remoting/host/policy_hack/policy_watcher.h" 44 #include "remoting/host/policy_hack/policy_watcher.h"
45 #include "remoting/host/session_manager_factory.h" 45 #include "remoting/host/session_manager_factory.h"
46 #include "remoting/host/signaling_connector.h" 46 #include "remoting/host/signaling_connector.h"
47 #include "remoting/host/usage_stats_consent.h" 47 #include "remoting/host/usage_stats_consent.h"
48 #include "remoting/host/video_frame_capturer.h" 48 #include "remoting/host/video_frame_capturer.h"
49 #include "remoting/jingle_glue/xmpp_signal_strategy.h" 49 #include "remoting/jingle_glue/xmpp_signal_strategy.h"
50 #include "remoting/protocol/me2me_host_authenticator_factory.h" 50 #include "remoting/protocol/me2me_host_authenticator_factory.h"
51 51
52 #if defined(OS_MACOSX) 52 #if defined(OS_MACOSX)
53 #include "base/mac/scoped_cftyperef.h"
53 #include "base/mac/scoped_nsautorelease_pool.h" 54 #include "base/mac/scoped_nsautorelease_pool.h"
54 #include "remoting/host/curtain_mode_mac.h" 55 #include "remoting/host/curtain_mode_mac.h"
55 #include "remoting/host/sighup_listener_mac.h" 56 #include "remoting/host/sighup_listener_mac.h"
56 #endif 57 #endif
57 // N.B. OS_WIN is defined by including src/base headers. 58 // N.B. OS_WIN is defined by including src/base headers.
58 #if defined(OS_WIN) 59 #if defined(OS_WIN)
59 #include <commctrl.h> 60 #include <commctrl.h>
60 #endif 61 #endif
61 #if defined(TOOLKIT_GTK) 62 #if defined(TOOLKIT_GTK)
62 #include "ui/gfx/gtk_util.h" 63 #include "ui/gfx/gtk_util.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 HostProcess() 97 HostProcess()
97 : message_loop_(MessageLoop::TYPE_UI), 98 : message_loop_(MessageLoop::TYPE_UI),
98 #ifdef OFFICIAL_BUILD 99 #ifdef OFFICIAL_BUILD
99 oauth_use_official_client_id_(true), 100 oauth_use_official_client_id_(true),
100 #else 101 #else
101 oauth_use_official_client_id_(false), 102 oauth_use_official_client_id_(false),
102 #endif 103 #endif
103 allow_nat_traversal_(true), 104 allow_nat_traversal_(true),
104 restarting_(false), 105 restarting_(false),
105 shutting_down_(false), 106 shutting_down_(false),
106 exit_code_(kSuccessExitCode) { 107 exit_code_(kSuccessExitCode),
108 #if defined(OS_MACOSX)
109 curtain_(base::Bind(&HostProcess::OnDisconnectRequested,
110 base::Unretained(this)),
111 base::Bind(&HostProcess::OnDisconnectRequested,
112 base::Unretained(this)))
113 #endif
114 {
107 context_.reset( 115 context_.reset(
108 new ChromotingHostContext(message_loop_.message_loop_proxy())); 116 new ChromotingHostContext(message_loop_.message_loop_proxy()));
109 context_->Start(); 117 context_->Start();
110 network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); 118 network_change_notifier_.reset(net::NetworkChangeNotifier::Create());
111 config_updated_timer_.reset(new base::DelayTimer<HostProcess>( 119 config_updated_timer_.reset(new base::DelayTimer<HostProcess>(
112 FROM_HERE, base::TimeDelta::FromSeconds(2), this, 120 FROM_HERE, base::TimeDelta::FromSeconds(2), this,
113 &HostProcess::ConfigUpdatedDelayed)); 121 &HostProcess::ConfigUpdatedDelayed));
114 } 122 }
115 123
116 bool InitWithCommandLine(const CommandLine* cmd_line) { 124 bool InitWithCommandLine(const CommandLine* cmd_line) {
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 } 320 }
313 321
314 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) { 322 void OnPolicyUpdate(scoped_ptr<base::DictionaryValue> policies) {
315 if (!context_->network_task_runner()->BelongsToCurrentThread()) { 323 if (!context_->network_task_runner()->BelongsToCurrentThread()) {
316 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( 324 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind(
317 &HostProcess::OnPolicyUpdate, base::Unretained(this), 325 &HostProcess::OnPolicyUpdate, base::Unretained(this),
318 base::Passed(&policies))); 326 base::Passed(&policies)));
319 return; 327 return;
320 } 328 }
321 329
330 if (!host_) {
331 StartHost();
Jamie 2012/08/13 23:22:43 Starting the host before calling any of the OnPoli
332 }
333
322 bool bool_value; 334 bool bool_value;
323 std::string string_value; 335 std::string string_value;
324 if (policies->GetString(policy_hack::PolicyWatcher::kHostDomainPolicyName, 336 if (policies->GetString(policy_hack::PolicyWatcher::kHostDomainPolicyName,
325 &string_value)) { 337 &string_value)) {
326 OnHostDomainPolicyUpdate(string_value); 338 OnHostDomainPolicyUpdate(string_value);
327 } 339 }
328 if (policies->GetBoolean(policy_hack::PolicyWatcher::kNatPolicyName, 340 if (policies->GetBoolean(policy_hack::PolicyWatcher::kNatPolicyName,
329 &bool_value)) { 341 &bool_value)) {
330 OnNatPolicyUpdate(bool_value); 342 OnNatPolicyUpdate(bool_value);
331 } 343 }
344 if (policies->GetBoolean(
345 policy_hack::PolicyWatcher::kHostRequireCurtainPolicyName,
346 &bool_value)) {
347 OnCurtainPolicyUpdate(bool_value);
348 }
332 } 349 }
333 350
334 void OnHostDomainPolicyUpdate(const std::string& host_domain) { 351 void OnHostDomainPolicyUpdate(const std::string& host_domain) {
335 if (!context_->network_task_runner()->BelongsToCurrentThread()) { 352 if (!context_->network_task_runner()->BelongsToCurrentThread()) {
336 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( 353 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind(
337 &HostProcess::OnHostDomainPolicyUpdate, base::Unretained(this), 354 &HostProcess::OnHostDomainPolicyUpdate, base::Unretained(this),
338 host_domain)); 355 host_domain));
339 return; 356 return;
340 } 357 }
341 358
342 if (!host_domain.empty() && 359 if (!host_domain.empty() &&
343 !EndsWith(xmpp_login_, std::string("@") + host_domain, false)) { 360 !EndsWith(xmpp_login_, std::string("@") + host_domain, false)) {
344 Shutdown(kInvalidHostDomainExitCode); 361 Shutdown(kInvalidHostDomainExitCode);
345 } 362 }
346 } 363 }
347 364
348 void OnNatPolicyUpdate(bool nat_traversal_enabled) { 365 void OnNatPolicyUpdate(bool nat_traversal_enabled) {
349 if (!context_->network_task_runner()->BelongsToCurrentThread()) { 366 if (!context_->network_task_runner()->BelongsToCurrentThread()) {
350 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind( 367 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind(
351 &HostProcess::OnNatPolicyUpdate, base::Unretained(this), 368 &HostProcess::OnNatPolicyUpdate, base::Unretained(this),
352 nat_traversal_enabled)); 369 nat_traversal_enabled));
353 return; 370 return;
354 } 371 }
355 372
356 bool policy_changed = allow_nat_traversal_ != nat_traversal_enabled; 373 bool policy_changed = allow_nat_traversal_ != nat_traversal_enabled;
357 allow_nat_traversal_ = nat_traversal_enabled; 374 allow_nat_traversal_ = nat_traversal_enabled;
358 375
359 if (host_) { 376 if (policy_changed) {
360 // Restart the host if the policy has changed while the host was 377 RestartHost();
361 // online.
362 if (policy_changed)
363 RestartHost();
364 } else {
365 // Just start the host otherwise.
366 StartHost();
367 } 378 }
368 } 379 }
369 380
381 void OnCurtainPolicyUpdate(bool curtain_required) {
382 #if defined(OS_MACOSX)
383 if (!context_->network_task_runner()->BelongsToCurrentThread()) {
384 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind(
385 &HostProcess::OnCurtainPolicyUpdate, base::Unretained(this),
386 curtain_required));
387 return;
388 }
389
390 if (curtain_required) {
391 // If curtain mode is required, then we can't currently support remoting
392 // the login screen. This is because the current daemon architecture means
393 // that the remote user is disconnected immediately after login, leaving
394 // the host system uncurtained.
395 //
396 // TODO(jamiewalch): Fix this once we have implemented the multi-process
397 // daemon architecture
398 base::mac::ScopedCFTypeRef<CFDictionaryRef> session(
399 CGSessionCopyCurrentDictionary());
400 const void* logged_in = CFDictionaryGetValue(session,
401 kCGSessionLoginDoneKey);
402 if (logged_in != kCFBooleanTrue) {
403 Shutdown(kLoginScreenNotSupportedExitCode);
404 return;
405 }
406
407 host_->AddStatusObserver(&curtain_);
408 curtain_.SetEnabled(true);
409 } else {
410 curtain_.SetEnabled(false);
411 host_->RemoveStatusObserver(&curtain_);
412 }
413 #endif
414 }
415
370 void StartHost() { 416 void StartHost() {
371 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); 417 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
372 DCHECK(!host_); 418 DCHECK(!host_);
373 419
374 if (shutting_down_) 420 if (shutting_down_)
375 return; 421 return;
376 422
377 if (!signal_strategy_.get()) { 423 if (!signal_strategy_.get()) {
378 signal_strategy_.reset( 424 signal_strategy_.reset(
379 new XmppSignalStrategy(context_->url_request_context_getter(), 425 new XmppSignalStrategy(context_->url_request_context_getter(),
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 log_to_server_.reset( 486 log_to_server_.reset(
441 new LogToServer(host_, ServerLogEntry::ME2ME, signal_strategy_.get())); 487 new LogToServer(host_, ServerLogEntry::ME2ME, signal_strategy_.get()));
442 host_event_logger_ = HostEventLogger::Create(host_, kApplicationName); 488 host_event_logger_ = HostEventLogger::Create(host_, kApplicationName);
443 489
444 #if defined(OS_MACOSX) || defined(OS_WIN) 490 #if defined(OS_MACOSX) || defined(OS_WIN)
445 host_user_interface_->Start( 491 host_user_interface_->Start(
446 host_, base::Bind(&HostProcess::OnDisconnectRequested, 492 host_, base::Bind(&HostProcess::OnDisconnectRequested,
447 base::Unretained(this))); 493 base::Unretained(this)));
448 #endif 494 #endif
449 495
450 #if defined(OS_MACOSX)
451 curtain_.Init(base::Bind(&HostProcess::OnDisconnectRequested,
452 base::Unretained(this)));
453 host_->AddStatusObserver(&curtain_);
454 #endif
455
456 host_->Start(); 496 host_->Start();
457 497
458 CreateAuthenticatorFactory(); 498 CreateAuthenticatorFactory();
459 } 499 }
460 500
461 void OnAuthFailed() { 501 void OnAuthFailed() {
462 Shutdown(kInvalidOauthCredentialsExitCode); 502 Shutdown(kInvalidOauthCredentialsExitCode);
463 } 503 }
464 504
465 // Invoked when the user uses the Disconnect windows to terminate 505 // Invoked when the user uses the Disconnect windows to terminate
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 user32.GetFunctionPointer("SetProcessDPIAware")); 698 user32.GetFunctionPointer("SetProcessDPIAware"));
659 set_process_dpi_aware(); 699 set_process_dpi_aware();
660 } 700 }
661 701
662 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting 702 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting
663 // the command line from GetCommandLineW(), so we can safely pass NULL here. 703 // the command line from GetCommandLineW(), so we can safely pass NULL here.
664 return main(0, NULL); 704 return main(0, NULL);
665 } 705 }
666 706
667 #endif // defined(OS_WIN) 707 #endif // defined(OS_WIN)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698