webrtc_identity_service_host.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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