12e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// Copyright 2014 The Chromium Authors. All rights reserved.
22e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// Use of this source code is governed by a BSD-style license that can be
32e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// found in the LICENSE file.
42e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
52e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/password_manager/content/browser/content_password_manager_driver.h"
62e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
72e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/content/browser/content_autofill_driver.h"
82e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/content/common/autofill_messages.h"
92e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/core/common/form_data.h"
102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/autofill/core/common/password_form.h"
112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "components/password_manager/core/browser/password_manager_client.h"
122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/browser_context.h"
132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/navigation_details.h"
142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/navigation_entry.h"
152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/render_view_host.h"
162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/browser/web_contents.h"
172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "content/public/common/ssl_status.h"
1850d62d1b4a98adbc83de8f8cd1379ea1c25656f7Douglas Gregor#include "ipc/ipc_message_macros.h"
19d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer#include "net/cert/cert_status_flags.h"
20aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar
212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregornamespace password_manager {
222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorContentPasswordManagerDriver::ContentPasswordManagerDriver(
242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    content::WebContents* web_contents,
252e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    PasswordManagerClient* client,
262e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    autofill::AutofillClient* autofill_client)
27011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner    : WebContentsObserver(web_contents),
28011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner      password_manager_(client),
293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt      password_generation_manager_(client),
30011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner      password_autofill_manager_(client, autofill_client) {
312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DCHECK(web_contents);
32011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner}
332a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
342577743c5650c646fb705df01403707e94f2df04Abramo BagnaraContentPasswordManagerDriver::~ContentPasswordManagerDriver() {}
352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
362e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::FillPasswordForm(
372e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    const autofill::PasswordFormFillData& form_data) {
382e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DCHECK(web_contents());
392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  web_contents()->GetRenderViewHost()->Send(new AutofillMsg_FillPasswordForm(
402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      web_contents()->GetRenderViewHost()->GetRoutingID(), form_data));
412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::AllowPasswordGenerationForForm(
442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    const autofill::PasswordForm& form) {
452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  host->Send(new AutofillMsg_FormNotBlacklisted(host->GetRoutingID(), form));
472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::AccountCreationFormsFound(
502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    const std::vector<autofill::FormData>& forms) {
512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
52e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  host->Send(new AutofillMsg_AccountCreationFormsDetected(host->GetRoutingID(),
532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor                                                          forms));
543e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt}
552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
562e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::FillSuggestion(
572e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    const base::string16& username,
582e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    const base::string16& password) {
592e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  host->Send(
6151603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor      new AutofillMsg_FillPasswordSuggestion(host->GetRoutingID(),
6251603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor                                             username,
6351603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor                                             password));
642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
652e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
6651603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregorvoid ContentPasswordManagerDriver::PreviewSuggestion(
6751603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor    const base::string16& username,
6851603be62ba78adeb64246b222583dcde4b20b2aDouglas Gregor    const base::string16& password) {
692e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
702e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  host->Send(
712e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      new AutofillMsg_PreviewPasswordSuggestion(host->GetRoutingID(),
722e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                                                username,
732e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                                                password));
742e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
752e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
762e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::ClearPreviewedForm() {
77e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
78e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  host->Send(
792e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      new AutofillMsg_ClearPreviewedForm(host->GetRoutingID()));
80e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
81e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
82e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorbool ContentPasswordManagerDriver::DidLastPageLoadEncounterSSLErrors() {
832e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DCHECK(web_contents());
84e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // TODO(vabr): This is a wrong entry to look at for HTTP basic auth,
85e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  // http://crbug.com/388246.
86e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  content::NavigationEntry* entry =
872e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor      web_contents()->GetController().GetLastCommittedEntry();
88e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (!entry) {
89e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return false;
90e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  }
91e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
922e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return net::IsCertStatusError(entry->GetSSL().cert_status);
932e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
942e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
952e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorbool ContentPasswordManagerDriver::IsOffTheRecord() {
962e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  DCHECK(web_contents());
972e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return web_contents()->GetBrowserContext()->IsOffTheRecord();
982e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
992e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1002e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorPasswordGenerationManager*
1012e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorContentPasswordManagerDriver::GetPasswordGenerationManager() {
1022e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return &password_generation_manager_;
103e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
1042e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1052e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorPasswordManager* ContentPasswordManagerDriver::GetPasswordManager() {
1062e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return &password_manager_;
1072e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1082e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1092e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorPasswordAutofillManager*
1102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas GregorContentPasswordManagerDriver::GetPasswordAutofillManager() {
1112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return &password_autofill_manager_;
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
1132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregorvoid ContentPasswordManagerDriver::DidNavigateMainFrame(
115ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner    const content::LoadCommittedDetails& details,
1162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor    const content::FrameNavigateParams& params) {
1172e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  password_manager_.DidNavigateMainFrame(details.is_in_page);
118e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor}
119e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
120e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregorbool ContentPasswordManagerDriver::OnMessageReceived(
121e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    const IPC::Message& message) {
122ac8d75fe94f2aefde5179d53e230b99a1fe1201aChris Lattner  bool handled = true;
123e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  IPC_BEGIN_MESSAGE_MAP(PasswordManager, message)
124e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormsParsed,
1253e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt                      &password_manager_,
1263e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt                      PasswordManager::OnPasswordFormsParsed)
1273e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormsRendered,
1283e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt                      &password_manager_,
1293e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt                      PasswordManager::OnPasswordFormsRendered)
1303e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  IPC_MESSAGE_FORWARD(AutofillHostMsg_PasswordFormSubmitted,
1312e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                      &password_manager_,
1322e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                      PasswordManager::OnPasswordFormSubmitted)
1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  IPC_MESSAGE_FORWARD(AutofillHostMsg_ShowPasswordSuggestions,
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                      &password_autofill_manager_,
1352e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor                      PasswordAutofillManager::OnShowPasswordSuggestions)
136e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  IPC_MESSAGE_FORWARD(AutofillHostMsg_AddPasswordFormMapping,
137e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor                      &password_autofill_manager_,
138e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor                      PasswordAutofillManager::OnAddPasswordFormMapping)
139e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  IPC_MESSAGE_FORWARD(AutofillHostMsg_RecordSavePasswordProgress,
140e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor                      password_manager_.client(),
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                      PasswordManagerClient::LogSavePasswordProgress)
1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  IPC_MESSAGE_UNHANDLED(handled = false)
143e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  IPC_END_MESSAGE_MAP()
144e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor
1452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor  return handled;
1462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}
1473e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt
1483e518bda00d710754ca077cf9be8dd821e16a854Sean Huntautofill::AutofillManager* ContentPasswordManagerDriver::GetAutofillManager() {
1493e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  autofill::ContentAutofillDriver* driver =
1503e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt      autofill::ContentAutofillDriver::FromWebContents(web_contents());
1513e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt  return driver ? driver->autofill_manager() : NULL;
1523e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt}
1532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor
1542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor}  // namespace password_manager
1552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor