// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/webui/options/password_manager_handler.h" #include "base/bind.h" #include "base/prefs/pref_service.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/profiles/profile.h" #if defined(OS_WIN) && defined(USE_ASH) #include "chrome/browser/ui/ash/ash_util.h" #endif #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "components/autofill/core/common/password_form.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_source.h" #include "content/public/browser/user_metrics.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "net/base/net_util.h" namespace options { PasswordManagerHandler::PasswordManagerHandler() : password_manager_presenter_(this) {} PasswordManagerHandler::~PasswordManagerHandler() {} Profile* PasswordManagerHandler::GetProfile() { return Profile::FromWebUI(web_ui()); } #if !defined(OS_ANDROID) gfx::NativeWindow PasswordManagerHandler::GetNativeWindow() { return web_ui()->GetWebContents()->GetTopLevelNativeWindow(); } #endif void PasswordManagerHandler::GetLocalizedValues( base::DictionaryValue* localized_strings) { DCHECK(localized_strings); static const OptionsStringResource resources[] = { { "savedPasswordsTitle", IDS_PASSWORDS_SHOW_PASSWORDS_TAB_TITLE }, { "passwordExceptionsTitle", IDS_PASSWORDS_EXCEPTIONS_TAB_TITLE }, { "passwordSearchPlaceholder", IDS_PASSWORDS_PAGE_SEARCH_PASSWORDS }, { "passwordShowButton", IDS_PASSWORDS_PAGE_VIEW_SHOW_BUTTON }, { "passwordHideButton", IDS_PASSWORDS_PAGE_VIEW_HIDE_BUTTON }, { "passwordsNoPasswordsDescription", IDS_PASSWORDS_PAGE_VIEW_NO_PASSWORDS_DESCRIPTION }, { "passwordsNoExceptionsDescription", IDS_PASSWORDS_PAGE_VIEW_NO_EXCEPTIONS_DESCRIPTION }, }; RegisterStrings(localized_strings, resources, arraysize(resources)); RegisterTitle(localized_strings, "passwordsPage", IDS_PASSWORDS_EXCEPTIONS_WINDOW_TITLE); localized_strings->SetString("passwordManagerLearnMoreURL", chrome::kPasswordManagerLearnMoreURL); bool disable_show_passwords = false; #if defined(OS_WIN) && defined(USE_ASH) // We disable the ability to show passwords when running in Windows Metro // interface. This is because we cannot pop native Win32 dialogs from the // Metro process. // TODO(wfh): Revisit this if Metro usage grows. if (chrome::IsNativeWindowInAsh(GetNativeWindow())) disable_show_passwords = true; #endif localized_strings->SetBoolean("disableShowPasswords", disable_show_passwords); } void PasswordManagerHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( "updatePasswordLists", base::Bind(&PasswordManagerHandler::HandleUpdatePasswordLists, base::Unretained(this))); web_ui()->RegisterMessageCallback( "removeSavedPassword", base::Bind(&PasswordManagerHandler::HandleRemoveSavedPassword, base::Unretained(this))); web_ui()->RegisterMessageCallback( "removePasswordException", base::Bind(&PasswordManagerHandler::HandleRemovePasswordException, base::Unretained(this))); web_ui()->RegisterMessageCallback( "requestShowPassword", base::Bind(&PasswordManagerHandler::HandleRequestShowPassword, base::Unretained(this))); } void PasswordManagerHandler::InitializeHandler() { password_manager_presenter_.Initialize(); } void PasswordManagerHandler::HandleRemoveSavedPassword( const base::ListValue* args) { std::string string_value = base::UTF16ToUTF8(ExtractStringValue(args)); int index; if (base::StringToInt(string_value, &index) && index >= 0) { password_manager_presenter_.RemoveSavedPassword(static_cast(index)); } } void PasswordManagerHandler::HandleRemovePasswordException( const base::ListValue* args) { std::string string_value = base::UTF16ToUTF8(ExtractStringValue(args)); int index; if (base::StringToInt(string_value, &index) && index >= 0) { password_manager_presenter_.RemovePasswordException( static_cast(index)); } } void PasswordManagerHandler::HandleRequestShowPassword( const base::ListValue* args) { int index; if (!ExtractIntegerValue(args, &index)) NOTREACHED(); password_manager_presenter_.RequestShowPassword(static_cast(index)); } void PasswordManagerHandler::ShowPassword( size_t index, const base::string16& password_value) { // Call back the front end to reveal the password. web_ui()->CallJavascriptFunction( "PasswordManager.showPassword", base::FundamentalValue(static_cast(index)), base::StringValue(password_value)); } void PasswordManagerHandler::HandleUpdatePasswordLists( const base::ListValue* args) { password_manager_presenter_.UpdatePasswordLists(); } void PasswordManagerHandler::SetPasswordList( const ScopedVector& password_list, bool show_passwords) { base::ListValue entries; languages_ = GetProfile()->GetPrefs()->GetString(prefs::kAcceptLanguages); base::string16 placeholder(base::ASCIIToUTF16(" ")); for (size_t i = 0; i < password_list.size(); ++i) { base::ListValue* entry = new base::ListValue(); entry->Append(new base::StringValue(net::FormatUrl(password_list[i]->origin, languages_))); entry->Append(new base::StringValue(password_list[i]->username_value)); if (show_passwords) { entry->Append(new base::StringValue(password_list[i]->password_value)); } else { // Use a placeholder value with the same length as the password. entry->Append(new base::StringValue( base::string16(password_list[i]->password_value.length(), ' '))); } entries.Append(entry); } web_ui()->CallJavascriptFunction("PasswordManager.setSavedPasswordsList", entries); } void PasswordManagerHandler::SetPasswordExceptionList( const ScopedVector& password_exception_list) { base::ListValue entries; for (size_t i = 0; i < password_exception_list.size(); ++i) { entries.Append(new base::StringValue( net::FormatUrl(password_exception_list[i]->origin, languages_))); } web_ui()->CallJavascriptFunction("PasswordManager.setPasswordExceptionsList", entries); } } // namespace options