1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/renderer_host/media/webrtc_identity_service_host.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/callback_helpers.h" 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/browser/child_process_security_policy_impl.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/media/webrtc_identity_store.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/media/webrtc_identity_messages.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_errors.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content { 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebRTCIdentityServiceHost::WebRTCIdentityServiceHost( 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int renderer_process_id, 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<WebRTCIdentityStore> identity_store) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : BrowserMessageFilter(WebRTCIdentityMsgStart), 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) renderer_process_id_(renderer_process_id), 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) identity_store_(identity_store), 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_(this) {} 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebRTCIdentityServiceHost::~WebRTCIdentityServiceHost() { 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!cancel_callback_.is_null()) 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cancel_callback_.Run(); 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WebRTCIdentityServiceHost::OnMessageReceived(const IPC::Message& message) { 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool handled = true; 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(WebRTCIdentityServiceHost, message) 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(WebRTCIdentityMsg_RequestIdentity, OnRequestIdentity) 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(WebRTCIdentityMsg_CancelRequest, OnCancelRequest) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_UNHANDLED(handled = false) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return handled; 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebRTCIdentityServiceHost::OnRequestIdentity( 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int sequence_number, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& origin, 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& identity_name, 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& common_name) { 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!cancel_callback_.is_null()) { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DLOG(WARNING) 46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch << "Request rejected because the previous request has not finished."; 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendErrorMessage(sequence_number, net::ERR_INSUFFICIENT_RESOURCES); 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ChildProcessSecurityPolicyImpl* policy = 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ChildProcessSecurityPolicyImpl::GetInstance(); 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!policy->CanAccessCookiesForOrigin(renderer_process_id_, origin)) { 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG(WARNING) << "Request rejected because origin access is denied."; 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendErrorMessage(sequence_number, net::ERR_ACCESS_DENIED); 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cancel_callback_ = identity_store_->RequestIdentity( 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch origin, 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch identity_name, 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch common_name, 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&WebRTCIdentityServiceHost::OnComplete, 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_.GetWeakPtr(), 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sequence_number)); 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (cancel_callback_.is_null()) { 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendErrorMessage(sequence_number, net::ERR_UNEXPECTED); 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebRTCIdentityServiceHost::OnCancelRequest() { 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // cancel_callback_ may be null if we have sent the reponse to the renderer 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // but the renderer has not received it. 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!cancel_callback_.is_null()) 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::ResetAndReturn(&cancel_callback_).Run(); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebRTCIdentityServiceHost::OnComplete(int sequence_number, 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int status, 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& certificate, 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& private_key) { 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cancel_callback_.Reset(); 83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (status == net::OK) { 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Send(new WebRTCIdentityHostMsg_IdentityReady( 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sequence_number, certificate, private_key)); 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendErrorMessage(sequence_number, status); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebRTCIdentityServiceHost::SendErrorMessage(int sequence_number, 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int error) { 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Send(new WebRTCIdentityHostMsg_RequestFailed(sequence_number, error)); 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 97