Home | History | Annotate | Download | only in host
      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
      3 // found in the LICENSE file.
      4 
      5 #include "remoting/host/me2me_desktop_environment.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/single_thread_task_runner.h"
      9 #include "remoting/base/logging.h"
     10 #include "remoting/host/client_session_control.h"
     11 #include "remoting/host/curtain_mode.h"
     12 #include "remoting/host/desktop_resizer.h"
     13 #include "remoting/host/gnubby_auth_handler.h"
     14 #include "remoting/host/host_window.h"
     15 #include "remoting/host/host_window.h"
     16 #include "remoting/host/host_window_proxy.h"
     17 #include "remoting/host/local_input_monitor.h"
     18 #include "remoting/host/resizing_host_observer.h"
     19 #include "remoting/host/screen_controls.h"
     20 #include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
     21 #include "third_party/webrtc/modules/desktop_capture/screen_capturer.h"
     22 
     23 #if defined(OS_POSIX)
     24 #include <sys/types.h>
     25 #include <unistd.h>
     26 #endif  // defined(OS_POSIX)
     27 
     28 const char kRateLimitResizeRequests[] = "rateLimitResizeRequests";
     29 
     30 namespace remoting {
     31 
     32 Me2MeDesktopEnvironment::~Me2MeDesktopEnvironment() {
     33   DCHECK(caller_task_runner()->BelongsToCurrentThread());
     34 }
     35 
     36 scoped_ptr<ScreenControls> Me2MeDesktopEnvironment::CreateScreenControls() {
     37   DCHECK(caller_task_runner()->BelongsToCurrentThread());
     38 
     39   return scoped_ptr<ScreenControls>(
     40       new ResizingHostObserver(DesktopResizer::Create()));
     41 }
     42 
     43 scoped_ptr<webrtc::ScreenCapturer>
     44 Me2MeDesktopEnvironment::CreateVideoCapturer() {
     45   DCHECK(caller_task_runner()->BelongsToCurrentThread());
     46   webrtc::DesktopCaptureOptions options =
     47       webrtc::DesktopCaptureOptions::CreateDefault();
     48   options.set_use_update_notifications(true);
     49   return scoped_ptr<webrtc::ScreenCapturer>(
     50       webrtc::ScreenCapturer::Create(options));
     51 }
     52 
     53 std::string Me2MeDesktopEnvironment::GetCapabilities() const {
     54   return kRateLimitResizeRequests;
     55 }
     56 
     57 Me2MeDesktopEnvironment::Me2MeDesktopEnvironment(
     58     scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
     59     scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
     60     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
     61     : BasicDesktopEnvironment(caller_task_runner,
     62                               input_task_runner,
     63                               ui_task_runner),
     64       gnubby_auth_enabled_(false) {
     65   DCHECK(caller_task_runner->BelongsToCurrentThread());
     66 }
     67 
     68 scoped_ptr<GnubbyAuthHandler> Me2MeDesktopEnvironment::CreateGnubbyAuthHandler(
     69     protocol::ClientStub* client_stub) {
     70   DCHECK(caller_task_runner()->BelongsToCurrentThread());
     71 
     72   if (gnubby_auth_enabled_)
     73     return scoped_ptr<GnubbyAuthHandler>(
     74         GnubbyAuthHandler::Create(client_stub));
     75 
     76   HOST_LOG << "gnubby auth is not enabled";
     77   return scoped_ptr<GnubbyAuthHandler>();
     78 }
     79 
     80 bool Me2MeDesktopEnvironment::InitializeSecurity(
     81     base::WeakPtr<ClientSessionControl> client_session_control,
     82     bool curtain_enabled) {
     83   DCHECK(caller_task_runner()->BelongsToCurrentThread());
     84 
     85   // Detach the session from the local console if the caller requested.
     86   if (curtain_enabled) {
     87     curtain_ = CurtainMode::Create(caller_task_runner(),
     88                                    ui_task_runner(),
     89                                    client_session_control);
     90     bool active = curtain_->Activate();
     91     if (!active)
     92       LOG(ERROR) << "Failed to activate the curtain mode.";
     93     return active;
     94   }
     95 
     96   // Otherwise, if the session is shared with the local user start monitoring
     97   // the local input and create the in-session UI.
     98 
     99 #if defined(OS_LINUX)
    100   bool want_user_interface = false;
    101 #elif defined(OS_MACOSX)
    102   // Don't try to display any UI on top of the system's login screen as this
    103   // is rejected by the Window Server on OS X 10.7.4, and prevents the
    104   // capturer from working (http://crbug.com/140984).
    105 
    106   // TODO(lambroslambrou): Use a better technique of detecting whether we're
    107   // running in the LoginWindow context, and refactor this into a separate
    108   // function to be used here and in CurtainMode::ActivateCurtain().
    109   bool want_user_interface = getuid() != 0;
    110 #elif defined(OS_WIN)
    111   bool want_user_interface = true;
    112 #endif  // defined(OS_WIN)
    113 
    114   // Create the disconnect window.
    115   if (want_user_interface) {
    116     // Create the local input monitor.
    117     local_input_monitor_ = LocalInputMonitor::Create(caller_task_runner(),
    118                                                      input_task_runner(),
    119                                                      ui_task_runner(),
    120                                                      client_session_control);
    121 
    122     disconnect_window_ = HostWindow::CreateDisconnectWindow();
    123     disconnect_window_.reset(new HostWindowProxy(
    124         caller_task_runner(),
    125         ui_task_runner(),
    126         disconnect_window_.Pass()));
    127     disconnect_window_->Start(client_session_control);
    128   }
    129 
    130   return true;
    131 }
    132 
    133 void Me2MeDesktopEnvironment::SetEnableGnubbyAuth(bool gnubby_auth_enabled) {
    134   gnubby_auth_enabled_ = gnubby_auth_enabled;
    135 }
    136 
    137 Me2MeDesktopEnvironmentFactory::Me2MeDesktopEnvironmentFactory(
    138     scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
    139     scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
    140     scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
    141     : BasicDesktopEnvironmentFactory(caller_task_runner,
    142                                      input_task_runner,
    143                                      ui_task_runner),
    144       curtain_enabled_(false) {
    145 }
    146 
    147 Me2MeDesktopEnvironmentFactory::~Me2MeDesktopEnvironmentFactory() {
    148 }
    149 
    150 scoped_ptr<DesktopEnvironment> Me2MeDesktopEnvironmentFactory::Create(
    151     base::WeakPtr<ClientSessionControl> client_session_control) {
    152   DCHECK(caller_task_runner()->BelongsToCurrentThread());
    153 
    154   scoped_ptr<Me2MeDesktopEnvironment> desktop_environment(
    155       new Me2MeDesktopEnvironment(caller_task_runner(),
    156                                   input_task_runner(),
    157                                   ui_task_runner()));
    158   if (!desktop_environment->InitializeSecurity(client_session_control,
    159                                                curtain_enabled_)) {
    160     return scoped_ptr<DesktopEnvironment>();
    161   }
    162   desktop_environment->SetEnableGnubbyAuth(gnubby_auth_enabled_);
    163 
    164   return desktop_environment.PassAs<DesktopEnvironment>();
    165 }
    166 
    167 void Me2MeDesktopEnvironmentFactory::SetEnableCurtaining(bool enable) {
    168   DCHECK(caller_task_runner()->BelongsToCurrentThread());
    169 
    170   curtain_enabled_ = enable;
    171 }
    172 
    173 void Me2MeDesktopEnvironmentFactory::SetEnableGnubbyAuth(
    174     bool gnubby_auth_enabled) {
    175   gnubby_auth_enabled_ = gnubby_auth_enabled;
    176 }
    177 
    178 }  // namespace remoting
    179