103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/password_manager/content/renderer/credential_manager_client.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/password_manager/content/common/credential_manager_messages.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/password_manager/content/common/credential_manager_types.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/renderer/render_view.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCredential.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCredentialManagerError.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace password_manager { 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace { 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)template <typename T> 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ClearCallbacksMapWithErrors(T* callbacks_map) { 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) typename T::iterator iter(callbacks_map); 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) while (!iter.IsAtEnd()) { 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blink::WebCredentialManagerError reason( 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blink::WebCredentialManagerError::ErrorTypeUnknown, 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "An unknown error occurred."); 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) iter.GetCurrentValue()->onError(&reason); 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callbacks_map->Remove(iter.GetCurrentKey()); 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) iter.Advance(); 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCredentialManagerClient::CredentialManagerClient( 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::RenderView* render_view) 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : content::RenderViewObserver(render_view) { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci render_view->GetWebView()->setCredentialManagerClient(this); 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)CredentialManagerClient::~CredentialManagerClient() { 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ClearCallbacksMapWithErrors(&failed_sign_in_callbacks_); 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ClearCallbacksMapWithErrors(&signed_in_callbacks_); 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ClearCallbacksMapWithErrors(&signed_out_callbacks_); 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ClearCallbacksMapWithErrors(&request_callbacks_); 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// ----------------------------------------------------------------------------- 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Handle messages from the browser. 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool CredentialManagerClient::OnMessageReceived(const IPC::Message& message) { 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool handled = true; 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(CredentialManagerClient, message) 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(CredentialManagerMsg_AcknowledgeFailedSignIn, 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OnAcknowledgeFailedSignIn) 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(CredentialManagerMsg_AcknowledgeSignedIn, 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OnAcknowledgeSignedIn) 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(CredentialManagerMsg_AcknowledgeSignedOut, 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OnAcknowledgeSignedOut) 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(CredentialManagerMsg_SendCredential, OnSendCredential) 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_END_MESSAGE_MAP() 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return handled; 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::OnAcknowledgeFailedSignIn(int request_id) { 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RespondToNotificationCallback(request_id, &failed_sign_in_callbacks_); 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::OnAcknowledgeSignedIn(int request_id) { 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RespondToNotificationCallback(request_id, &signed_in_callbacks_); 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::OnAcknowledgeSignedOut(int request_id) { 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RespondToNotificationCallback(request_id, &signed_out_callbacks_); 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::OnSendCredential(int request_id, 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const CredentialInfo& info) { 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RequestCallbacks* callbacks = request_callbacks_.Lookup(request_id); 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(callbacks); 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // TODO(mkwst): Split into local/federated credentials. 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blink::WebCredential credential(info.id, info.name, info.avatar); 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callbacks->onSuccess(&credential); 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) request_callbacks_.Remove(request_id); 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// ----------------------------------------------------------------------------- 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Dispatch messages from the renderer to the browser. 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::dispatchFailedSignIn( 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const blink::WebCredential& credential, 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blink::WebCredentialManagerClient::NotificationCallbacks* callbacks) { 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int request_id = failed_sign_in_callbacks_.Add(callbacks); 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CredentialInfo info( 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) credential.id(), credential.name(), credential.avatarURL()); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new CredentialManagerHostMsg_NotifyFailedSignIn( 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci routing_id(), request_id, info)); 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::dispatchSignedIn( 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const blink::WebCredential& credential, 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blink::WebCredentialManagerClient::NotificationCallbacks* callbacks) { 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int request_id = signed_in_callbacks_.Add(callbacks); 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CredentialInfo info( 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) credential.id(), credential.name(), credential.avatarURL()); 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new CredentialManagerHostMsg_NotifySignedIn( 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci routing_id(), request_id, info)); 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::dispatchSignedOut( 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NotificationCallbacks* callbacks) { 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int request_id = signed_out_callbacks_.Add(callbacks); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new CredentialManagerHostMsg_NotifySignedOut(routing_id(), request_id)); 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::dispatchRequest( 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool zeroClickOnly, 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const blink::WebVector<blink::WebURL>& federations, 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RequestCallbacks* callbacks) { 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int request_id = request_callbacks_.Add(callbacks); 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::vector<GURL> federation_vector; 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (size_t i = 0; i < std::min(federations.size(), kMaxFederations); ++i) 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) federation_vector.push_back(federations[i]); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new CredentialManagerHostMsg_RequestCredential( 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci routing_id(), request_id, zeroClickOnly, federation_vector)); 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CredentialManagerClient::RespondToNotificationCallback( 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int request_id, 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CredentialManagerClient::NotificationCallbacksMap* map) { 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blink::WebCredentialManagerClient::NotificationCallbacks* callbacks = 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) map->Lookup(request_id); 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(callbacks); 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callbacks->onSuccess(); 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) map->Remove(request_id); 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace password_manager 138