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

Side by Side Diff: remoting/host/win/rdp_client.cc

Issue 1935003003: Fixing curtain mode using non-default RDP port for Windows host. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing CR feedback Created 4 years, 7 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
« no previous file with comments | « remoting/host/win/rdp_client.h ('k') | remoting/host/win/rdp_client_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 #include "remoting/host/win/rdp_client.h" 5 #include "remoting/host/win/rdp_client.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/numerics/safe_conversions.h" 14 #include "base/numerics/safe_conversions.h"
15 #include "base/single_thread_task_runner.h" 15 #include "base/single_thread_task_runner.h"
16 #include "base/win/registry.h"
17 #include "net/base/ip_address.h" 16 #include "net/base/ip_address.h"
18 #include "net/base/ip_endpoint.h" 17 #include "net/base/ip_endpoint.h"
19 #include "remoting/base/typed_buffer.h" 18 #include "remoting/base/typed_buffer.h"
20 #include "remoting/host/win/rdp_client_window.h" 19 #include "remoting/host/win/rdp_client_window.h"
21 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" 20 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
22 21
23 namespace remoting { 22 namespace remoting {
24 23
25 namespace { 24 namespace {
26 25
27 // 127.0.0.1 is explicitly blocked by the RDP ActiveX control, so we use 26 // 127.0.0.1 is explicitly blocked by the RDP ActiveX control, so we use
28 // 127.0.0.2 instead. 27 // 127.0.0.2 instead.
29 const unsigned char kRdpLoopbackAddress[] = { 127, 0, 0, 2 }; 28 const unsigned char kRdpLoopbackAddress[] = { 127, 0, 0, 2 };
30 29
31 const int kDefaultRdpPort = 3389;
32
33 // The port number used by RDP is stored in the registry.
34 const wchar_t kRdpPortKeyName[] = L"SYSTEM\\CurrentControlSet\\Control\\"
35 L"Terminal Server\\WinStations\\RDP-Tcp";
36 const wchar_t kRdpPortValueName[] = L"PortNumber";
37
38 } // namespace 30 } // namespace
39 31
40 // The core of RdpClient is ref-counted since it services calls and notifies 32 // The core of RdpClient is ref-counted since it services calls and notifies
41 // events on the caller task runner, but runs the ActiveX control on the UI 33 // events on the caller task runner, but runs the ActiveX control on the UI
42 // task runner. 34 // task runner.
43 class RdpClient::Core 35 class RdpClient::Core
44 : public base::RefCountedThreadSafe<Core>, 36 : public base::RefCountedThreadSafe<Core>,
45 public RdpClientWindow::EventHandler { 37 public RdpClientWindow::EventHandler {
46 public: 38 public:
47 Core( 39 Core(
48 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 40 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
49 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 41 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
50 RdpClient::EventHandler* event_handler); 42 RdpClient::EventHandler* event_handler);
51 43
52 // Initiates a loopback RDP connection. 44 // Initiates a loopback RDP connection.
53 void Connect(const webrtc::DesktopSize& screen_size, 45 void Connect(const webrtc::DesktopSize& screen_size,
54 const std::string& terminal_id); 46 const std::string& terminal_id,
47 DWORD port_number);
55 48
56 // Initiates a graceful shutdown of the RDP connection. 49 // Initiates a graceful shutdown of the RDP connection.
57 void Disconnect(); 50 void Disconnect();
58 51
59 // Sends Secure Attention Sequence to the session. 52 // Sends Secure Attention Sequence to the session.
60 void InjectSas(); 53 void InjectSas();
61 54
62 // RdpClientWindow::EventHandler interface. 55 // RdpClientWindow::EventHandler interface.
63 void OnConnected() override; 56 void OnConnected() override;
64 void OnDisconnected() override; 57 void OnDisconnected() override;
(...skipping 24 matching lines...) Expand all
89 scoped_refptr<Core> self_; 82 scoped_refptr<Core> self_;
90 83
91 DISALLOW_COPY_AND_ASSIGN(Core); 84 DISALLOW_COPY_AND_ASSIGN(Core);
92 }; 85 };
93 86
94 RdpClient::RdpClient( 87 RdpClient::RdpClient(
95 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 88 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
96 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 89 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
97 const webrtc::DesktopSize& screen_size, 90 const webrtc::DesktopSize& screen_size,
98 const std::string& terminal_id, 91 const std::string& terminal_id,
92 DWORD port_number,
99 EventHandler* event_handler) { 93 EventHandler* event_handler) {
100 DCHECK(caller_task_runner->BelongsToCurrentThread()); 94 DCHECK(caller_task_runner->BelongsToCurrentThread());
101 95
102 core_ = new Core(caller_task_runner, ui_task_runner, event_handler); 96 core_ = new Core(caller_task_runner, ui_task_runner, event_handler);
103 core_->Connect(screen_size, terminal_id); 97 core_->Connect(screen_size, terminal_id, port_number);
104 } 98 }
105 99
106 RdpClient::~RdpClient() { 100 RdpClient::~RdpClient() {
107 DCHECK(CalledOnValidThread()); 101 DCHECK(CalledOnValidThread());
108 102
109 core_->Disconnect(); 103 core_->Disconnect();
110 } 104 }
111 105
112 void RdpClient::InjectSas() { 106 void RdpClient::InjectSas() {
113 DCHECK(CalledOnValidThread()); 107 DCHECK(CalledOnValidThread());
114 108
115 core_->InjectSas(); 109 core_->InjectSas();
116 } 110 }
117 111
118 RdpClient::Core::Core( 112 RdpClient::Core::Core(
119 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 113 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
120 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 114 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
121 RdpClient::EventHandler* event_handler) 115 RdpClient::EventHandler* event_handler)
122 : caller_task_runner_(caller_task_runner), 116 : caller_task_runner_(caller_task_runner),
123 ui_task_runner_(ui_task_runner), 117 ui_task_runner_(ui_task_runner),
124 event_handler_(event_handler) { 118 event_handler_(event_handler) {
125 } 119 }
126 120
127 void RdpClient::Core::Connect(const webrtc::DesktopSize& screen_size, 121 void RdpClient::Core::Connect(const webrtc::DesktopSize& screen_size,
128 const std::string& terminal_id) { 122 const std::string& terminal_id,
123 DWORD port_number) {
129 if (!ui_task_runner_->BelongsToCurrentThread()) { 124 if (!ui_task_runner_->BelongsToCurrentThread()) {
130 ui_task_runner_->PostTask( 125 ui_task_runner_->PostTask(
131 FROM_HERE, base::Bind(&Core::Connect, this, screen_size, terminal_id)); 126 FROM_HERE, base::Bind(&Core::Connect, this, screen_size, terminal_id,
127 port_number));
132 return; 128 return;
133 } 129 }
134 130
135 DCHECK(base::MessageLoopForUI::IsCurrent()); 131 DCHECK(base::MessageLoopForUI::IsCurrent());
136 DCHECK(!rdp_client_window_); 132 DCHECK(!rdp_client_window_);
137 DCHECK(!self_.get()); 133 DCHECK(!self_.get());
138 134
139 // Read the port number used by RDP.
140 DWORD server_port;
141 base::win::RegKey key(HKEY_LOCAL_MACHINE, kRdpPortKeyName, KEY_READ);
142 if (!key.Valid() ||
143 (key.ReadValueDW(kRdpPortValueName, &server_port) != ERROR_SUCCESS) ||
144 server_port > 65535) {
145 server_port = kDefaultRdpPort;
146 }
147
148 net::IPEndPoint server_endpoint(net::IPAddress(kRdpLoopbackAddress), 135 net::IPEndPoint server_endpoint(net::IPAddress(kRdpLoopbackAddress),
149 base::checked_cast<uint16_t>(server_port)); 136 base::checked_cast<uint16_t>(port_number));
150 137
151 // Create the ActiveX control window. 138 // Create the ActiveX control window.
152 rdp_client_window_.reset(new RdpClientWindow(server_endpoint, terminal_id, 139 rdp_client_window_.reset(new RdpClientWindow(server_endpoint, terminal_id,
153 this)); 140 this));
154 if (!rdp_client_window_->Connect(screen_size)) { 141 if (!rdp_client_window_->Connect(screen_size)) {
155 rdp_client_window_.reset(); 142 rdp_client_window_.reset();
156 143
157 // Notify the caller that connection attempt failed. 144 // Notify the caller that connection attempt failed.
158 NotifyClosed(); 145 NotifyClosed();
159 } 146 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 } 215 }
229 216
230 if (event_handler_) { 217 if (event_handler_) {
231 RdpClient::EventHandler* event_handler = event_handler_; 218 RdpClient::EventHandler* event_handler = event_handler_;
232 event_handler_ = nullptr; 219 event_handler_ = nullptr;
233 event_handler->OnRdpClosed(); 220 event_handler->OnRdpClosed();
234 } 221 }
235 } 222 }
236 223
237 } // namespace remoting 224 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/win/rdp_client.h ('k') | remoting/host/win/rdp_client_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698