webrtc_identity_service_host.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/media/webrtc_identity_store.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/common/media/webrtc_identity_messages.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_errors.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebRTCIdentityServiceHost::WebRTCIdentityServiceHost(
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WebRTCIdentityStore* identity_store)
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : identity_store_(identity_store) {}
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebRTCIdentityServiceHost::~WebRTCIdentityServiceHost() {
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!cancel_callback_.is_null())
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    cancel_callback_.Run();
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool WebRTCIdentityServiceHost::OnMessageReceived(const IPC::Message& message,
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                                bool* message_was_ok) {
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool handled = true;
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  IPC_BEGIN_MESSAGE_MAP_EX(WebRTCIdentityServiceHost, message, *message_was_ok)
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    IPC_MESSAGE_HANDLER(WebRTCIdentityMsg_RequestIdentity, OnRequestIdentity)
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    IPC_MESSAGE_HANDLER(WebRTCIdentityMsg_CancelRequest, OnCancelRequest)
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    IPC_MESSAGE_UNHANDLED(handled = false)
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  IPC_END_MESSAGE_MAP_EX()
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return handled;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid WebRTCIdentityServiceHost::OnRequestIdentity(
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const GURL& origin,
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& identity_name,
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& common_name) {
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!cancel_callback_.is_null()) {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DLOG(WARNING)
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        << "Request rejected because the previous request has not finished.";
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SendErrorMessage(net::ERR_INSUFFICIENT_RESOURCES);
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cancel_callback_ = identity_store_->RequestIdentity(
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      origin,
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      identity_name,
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      common_name,
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&WebRTCIdentityServiceHost::OnComplete,
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::Unretained(this)));
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (cancel_callback_.is_null()) {
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SendErrorMessage(net::ERR_UNEXPECTED);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebRTCIdentityServiceHost::OnCancelRequest() {
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::ResetAndReturn(&cancel_callback_).Run();
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebRTCIdentityServiceHost::OnComplete(int status,
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                         const std::string& certificate,
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                         const std::string& private_key) {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cancel_callback_.Reset();
64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (status == net::OK) {
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    Send(new WebRTCIdentityHostMsg_IdentityReady(certificate, private_key));
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SendErrorMessage(status);
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid WebRTCIdentityServiceHost::SendErrorMessage(int error) {
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Send(new WebRTCIdentityHostMsg_RequestFailed(error));
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
76