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