webrtc_identity_service_host.cc revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
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, 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WebRTCIdentityStore* identity_store) 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : renderer_process_id_(renderer_process_id), 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch identity_store_(identity_store) {} 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebRTCIdentityServiceHost::~WebRTCIdentityServiceHost() { 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!cancel_callback_.is_null()) 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cancel_callback_.Run(); 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool WebRTCIdentityServiceHost::OnMessageReceived(const IPC::Message& message, 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool* message_was_ok) { 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool handled = true; 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_BEGIN_MESSAGE_MAP_EX(WebRTCIdentityServiceHost, message, *message_was_ok) 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(WebRTCIdentityMsg_RequestIdentity, OnRequestIdentity) 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(WebRTCIdentityMsg_CancelRequest, OnCancelRequest) 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_UNHANDLED(handled = false) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_END_MESSAGE_MAP_EX() 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return handled; 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebRTCIdentityServiceHost::OnRequestIdentity( 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& origin, 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& identity_name, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& common_name) { 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!cancel_callback_.is_null()) { 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DLOG(WARNING) 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch << "Request rejected because the previous request has not finished."; 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SendErrorMessage(net::ERR_INSUFFICIENT_RESOURCES); 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ChildProcessSecurityPolicyImpl* policy = 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ChildProcessSecurityPolicyImpl::GetInstance(); 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!policy->CanAccessCookiesForOrigin(renderer_process_id_, origin)) { 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DLOG(WARNING) << "Request rejected because origin access is denied."; 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SendErrorMessage(net::ERR_ACCESS_DENIED); 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cancel_callback_ = identity_store_->RequestIdentity( 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch origin, 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch identity_name, 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch common_name, 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&WebRTCIdentityServiceHost::OnComplete, 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Unretained(this))); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (cancel_callback_.is_null()) { 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SendErrorMessage(net::ERR_UNEXPECTED); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebRTCIdentityServiceHost::OnCancelRequest() { 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::ResetAndReturn(&cancel_callback_).Run(); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebRTCIdentityServiceHost::OnComplete(int status, 73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& certificate, 74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& private_key) { 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cancel_callback_.Reset(); 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (status == net::OK) { 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Send(new WebRTCIdentityHostMsg_IdentityReady(certificate, private_key)); 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SendErrorMessage(status); 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebRTCIdentityServiceHost::SendErrorMessage(int error) { 84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Send(new WebRTCIdentityHostMsg_RequestFailed(error)); 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 88