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

Side by Side Diff: content/browser/renderer_host/media/media_stream_ui_proxy.cc

Issue 795703003: Don't auto allow access to media devices unless a the security origin of the requester is the same … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix problem with that the ui_request_ was used for state updates. Created 5 years, 10 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 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 "content/browser/renderer_host/media/media_stream_ui_proxy.h" 5 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "content/browser/frame_host/frame_tree_node.h"
8 #include "content/browser/frame_host/render_frame_host_delegate.h" 9 #include "content/browser/frame_host/render_frame_host_delegate.h"
9 #include "content/browser/frame_host/render_frame_host_impl.h" 10 #include "content/browser/frame_host/render_frame_host_impl.h"
10 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/browser_thread.h"
11 #include "content/public/common/content_switches.h" 12 #include "content/public/common/content_switches.h"
12 #include "media/video/capture/fake_video_capture_device.h" 13 #include "media/video/capture/fake_video_capture_device.h"
13 14
14 namespace content { 15 namespace content {
15 16
17 void SetAndCheckAncestorFlag(MediaStreamRequest* request) {
18 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
19 RenderFrameHostImpl* rfh =
20 RenderFrameHostImpl::FromID(request->render_process_id,
21 request->render_frame_id);
22
23 if (rfh == NULL) {
24 // RenderFrame destroyed before the request is handled?
25 return;
26 }
27 FrameTreeNode* node = rfh->frame_tree_node();
28
29 while (node->parent() != NULL) {
30 if (!node->HasSameOrigin(*node->parent())) {
31 request->all_ancestors_have_same_origin = false;
32 return;
33 }
34 node = node->parent();
35 }
36 request->all_ancestors_have_same_origin = true;
37 }
38
16 class MediaStreamUIProxy::Core { 39 class MediaStreamUIProxy::Core {
17 public: 40 public:
18 explicit Core(const base::WeakPtr<MediaStreamUIProxy>& proxy, 41 explicit Core(const base::WeakPtr<MediaStreamUIProxy>& proxy,
19 RenderFrameHostDelegate* test_render_delegate); 42 RenderFrameHostDelegate* test_render_delegate);
20 ~Core(); 43 ~Core();
21 44
22 void RequestAccess(const MediaStreamRequest& request); 45 void RequestAccess(scoped_ptr<MediaStreamRequest> request);
23 bool CheckAccess(const GURL& security_origin, 46 bool CheckAccess(const GURL& security_origin,
24 MediaStreamType type, 47 MediaStreamType type,
25 int process_id, 48 int process_id,
26 int frame_id); 49 int frame_id);
27 void OnStarted(gfx::NativeViewId* window_id); 50 void OnStarted(gfx::NativeViewId* window_id);
28 51
29 private: 52 private:
30 void ProcessAccessRequestResponse(const MediaStreamDevices& devices, 53 void ProcessAccessRequestResponse(const MediaStreamDevices& devices,
31 content::MediaStreamRequestResult result, 54 content::MediaStreamRequestResult result,
32 scoped_ptr<MediaStreamUI> stream_ui); 55 scoped_ptr<MediaStreamUI> stream_ui);
(...skipping 18 matching lines...) Expand all
51 : proxy_(proxy), 74 : proxy_(proxy),
52 test_render_delegate_(test_render_delegate), 75 test_render_delegate_(test_render_delegate),
53 weak_factory_(this) { 76 weak_factory_(this) {
54 } 77 }
55 78
56 MediaStreamUIProxy::Core::~Core() { 79 MediaStreamUIProxy::Core::~Core() {
57 DCHECK_CURRENTLY_ON(BrowserThread::UI); 80 DCHECK_CURRENTLY_ON(BrowserThread::UI);
58 } 81 }
59 82
60 void MediaStreamUIProxy::Core::RequestAccess( 83 void MediaStreamUIProxy::Core::RequestAccess(
61 const MediaStreamRequest& request) { 84 scoped_ptr<MediaStreamRequest> request) {
62 DCHECK_CURRENTLY_ON(BrowserThread::UI); 85 DCHECK_CURRENTLY_ON(BrowserThread::UI);
63 86
64 RenderFrameHostDelegate* render_delegate = GetRenderFrameHostDelegate( 87 RenderFrameHostDelegate* render_delegate = GetRenderFrameHostDelegate(
65 request.render_process_id, request.render_frame_id); 88 request->render_process_id, request->render_frame_id);
66 89
67 // Tab may have gone away, or has no delegate from which to request access. 90 // Tab may have gone away, or has no delegate from which to request access.
68 if (!render_delegate) { 91 if (!render_delegate) {
69 ProcessAccessRequestResponse(MediaStreamDevices(), 92 ProcessAccessRequestResponse(MediaStreamDevices(),
70 MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN, 93 MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN,
71 scoped_ptr<MediaStreamUI>()); 94 scoped_ptr<MediaStreamUI>());
72 return; 95 return;
73 } 96 }
97 SetAndCheckAncestorFlag(request.get());
74 98
75 render_delegate->RequestMediaAccessPermission( 99 render_delegate->RequestMediaAccessPermission(
76 request, base::Bind(&Core::ProcessAccessRequestResponse, 100 *request, base::Bind(&Core::ProcessAccessRequestResponse,
77 weak_factory_.GetWeakPtr())); 101 weak_factory_.GetWeakPtr()));
78 } 102 }
79 103
80 bool MediaStreamUIProxy::Core::CheckAccess(const GURL& security_origin, 104 bool MediaStreamUIProxy::Core::CheckAccess(const GURL& security_origin,
81 MediaStreamType type, 105 MediaStreamType type,
82 int render_process_id, 106 int render_process_id,
83 int render_frame_id) { 107 int render_frame_id) {
84 DCHECK_CURRENTLY_ON(BrowserThread::UI); 108 DCHECK_CURRENTLY_ON(BrowserThread::UI);
85 109
86 RenderFrameHostDelegate* render_delegate = 110 RenderFrameHostDelegate* render_delegate =
87 GetRenderFrameHostDelegate(render_process_id, render_frame_id); 111 GetRenderFrameHostDelegate(render_process_id, render_frame_id);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 : weak_factory_(this) { 171 : weak_factory_(this) {
148 DCHECK_CURRENTLY_ON(BrowserThread::IO); 172 DCHECK_CURRENTLY_ON(BrowserThread::IO);
149 core_.reset(new Core(weak_factory_.GetWeakPtr(), test_render_delegate)); 173 core_.reset(new Core(weak_factory_.GetWeakPtr(), test_render_delegate));
150 } 174 }
151 175
152 MediaStreamUIProxy::~MediaStreamUIProxy() { 176 MediaStreamUIProxy::~MediaStreamUIProxy() {
153 DCHECK_CURRENTLY_ON(BrowserThread::IO); 177 DCHECK_CURRENTLY_ON(BrowserThread::IO);
154 } 178 }
155 179
156 void MediaStreamUIProxy::RequestAccess( 180 void MediaStreamUIProxy::RequestAccess(
157 const MediaStreamRequest& request, 181 scoped_ptr<MediaStreamRequest> request,
158 const ResponseCallback& response_callback) { 182 const ResponseCallback& response_callback) {
159 DCHECK_CURRENTLY_ON(BrowserThread::IO); 183 DCHECK_CURRENTLY_ON(BrowserThread::IO);
160 184
161 response_callback_ = response_callback; 185 response_callback_ = response_callback;
162 BrowserThread::PostTask( 186 BrowserThread::PostTask(
163 BrowserThread::UI, FROM_HERE, 187 BrowserThread::UI, FROM_HERE,
164 base::Bind(&Core::RequestAccess, base::Unretained(core_.get()), request)); 188 base::Bind(&Core::RequestAccess, base::Unretained(core_.get()),
189 base::Passed(&request)));
165 } 190 }
166 191
167 void MediaStreamUIProxy::CheckAccess( 192 void MediaStreamUIProxy::CheckAccess(
168 const GURL& security_origin, 193 const GURL& security_origin,
169 MediaStreamType type, 194 MediaStreamType type,
170 int render_process_id, 195 int render_process_id,
171 int render_frame_id, 196 int render_frame_id,
172 const base::Callback<void(bool)>& callback) { 197 const base::Callback<void(bool)>& callback) {
173 DCHECK_CURRENTLY_ON(BrowserThread::IO); 198 DCHECK_CURRENTLY_ON(BrowserThread::IO);
174 199
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 280
256 void FakeMediaStreamUIProxy::SetMicAccess(bool access) { 281 void FakeMediaStreamUIProxy::SetMicAccess(bool access) {
257 mic_access_ = access; 282 mic_access_ = access;
258 } 283 }
259 284
260 void FakeMediaStreamUIProxy::SetCameraAccess(bool access) { 285 void FakeMediaStreamUIProxy::SetCameraAccess(bool access) {
261 camera_access_ = access; 286 camera_access_ = access;
262 } 287 }
263 288
264 void FakeMediaStreamUIProxy::RequestAccess( 289 void FakeMediaStreamUIProxy::RequestAccess(
265 const MediaStreamRequest& request, 290 scoped_ptr<MediaStreamRequest> request,
266 const ResponseCallback& response_callback) { 291 const ResponseCallback& response_callback) {
267 DCHECK_CURRENTLY_ON(BrowserThread::IO); 292 DCHECK_CURRENTLY_ON(BrowserThread::IO);
268 293
269 response_callback_ = response_callback; 294 response_callback_ = response_callback;
270 295
271 if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 296 if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
272 switches::kUseFakeUIForMediaStream) == "deny") { 297 switches::kUseFakeUIForMediaStream) == "deny") {
273 // Immediately deny the request. 298 // Immediately deny the request.
274 BrowserThread::PostTask( 299 BrowserThread::PostTask(
275 BrowserThread::IO, FROM_HERE, 300 BrowserThread::IO, FROM_HERE,
276 base::Bind(&MediaStreamUIProxy::ProcessAccessRequestResponse, 301 base::Bind(&MediaStreamUIProxy::ProcessAccessRequestResponse,
277 weak_factory_.GetWeakPtr(), 302 weak_factory_.GetWeakPtr(),
278 MediaStreamDevices(), 303 MediaStreamDevices(),
279 MEDIA_DEVICE_PERMISSION_DENIED)); 304 MEDIA_DEVICE_PERMISSION_DENIED));
280 return; 305 return;
281 } 306 }
282 307
283 MediaStreamDevices devices_to_use; 308 MediaStreamDevices devices_to_use;
284 bool accepted_audio = false; 309 bool accepted_audio = false;
285 bool accepted_video = false; 310 bool accepted_video = false;
286 311
287 // Use the first capture device of the same media type in the list for the 312 // Use the first capture device of the same media type in the list for the
288 // fake UI. 313 // fake UI.
289 for (MediaStreamDevices::const_iterator it = devices_.begin(); 314 for (MediaStreamDevices::const_iterator it = devices_.begin();
290 it != devices_.end(); ++it) { 315 it != devices_.end(); ++it) {
291 if (!accepted_audio && 316 if (!accepted_audio &&
292 IsAudioInputMediaType(request.audio_type) && 317 IsAudioInputMediaType(request->audio_type) &&
293 IsAudioInputMediaType(it->type) && 318 IsAudioInputMediaType(it->type) &&
294 (request.requested_audio_device_id.empty() || 319 (request->requested_audio_device_id.empty() ||
295 request.requested_audio_device_id == it->id)) { 320 request->requested_audio_device_id == it->id)) {
296 devices_to_use.push_back(*it); 321 devices_to_use.push_back(*it);
297 accepted_audio = true; 322 accepted_audio = true;
298 } else if (!accepted_video && 323 } else if (!accepted_video &&
299 IsVideoMediaType(request.video_type) && 324 IsVideoMediaType(request->video_type) &&
300 IsVideoMediaType(it->type) && 325 IsVideoMediaType(it->type) &&
301 (request.requested_video_device_id.empty() || 326 (request->requested_video_device_id.empty() ||
302 request.requested_video_device_id == it->id)) { 327 request->requested_video_device_id == it->id)) {
303 devices_to_use.push_back(*it); 328 devices_to_use.push_back(*it);
304 accepted_video = true; 329 accepted_video = true;
305 } 330 }
306 } 331 }
307 332
308 // Fail the request if a device doesn't exist for the requested type. 333 // Fail the request if a device doesn't exist for the requested type.
309 if ((request.audio_type != MEDIA_NO_SERVICE && !accepted_audio) || 334 if ((request->audio_type != MEDIA_NO_SERVICE && !accepted_audio) ||
310 (request.video_type != MEDIA_NO_SERVICE && !accepted_video)) { 335 (request->video_type != MEDIA_NO_SERVICE && !accepted_video)) {
311 devices_to_use.clear(); 336 devices_to_use.clear();
312 } 337 }
313 338
314 BrowserThread::PostTask( 339 BrowserThread::PostTask(
315 BrowserThread::IO, FROM_HERE, 340 BrowserThread::IO, FROM_HERE,
316 base::Bind(&MediaStreamUIProxy::ProcessAccessRequestResponse, 341 base::Bind(&MediaStreamUIProxy::ProcessAccessRequestResponse,
317 weak_factory_.GetWeakPtr(), 342 weak_factory_.GetWeakPtr(),
318 devices_to_use, 343 devices_to_use,
319 devices_to_use.empty() ? 344 devices_to_use.empty() ?
320 MEDIA_DEVICE_NO_HARDWARE : 345 MEDIA_DEVICE_NO_HARDWARE :
(...skipping 25 matching lines...) Expand all
346 callback, 371 callback,
347 have_access)); 372 have_access));
348 return; 373 return;
349 } 374 }
350 375
351 void FakeMediaStreamUIProxy::OnStarted( 376 void FakeMediaStreamUIProxy::OnStarted(
352 const base::Closure& stop_callback, 377 const base::Closure& stop_callback,
353 const WindowIdCallback& window_id_callback) {} 378 const WindowIdCallback& window_id_callback) {}
354 379
355 } // namespace content 380 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698