1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/webui/options/password_manager_handler.h"
6
7 #include "base/bind.h"
8 #include "base/prefs/pref_service.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h"
12 #include "chrome/browser/chrome_notification_types.h"
13 #include "chrome/browser/profiles/profile.h"
14 #if defined(OS_WIN) && defined(USE_ASH)
15 #include "chrome/browser/ui/ash/ash_util.h"
16 #endif
17 #include "chrome/common/pref_names.h"
18 #include "chrome/common/url_constants.h"
19 #include "components/autofill/core/common/password_form.h"
20 #include "content/public/browser/notification_details.h"
21 #include "content/public/browser/notification_source.h"
22 #include "content/public/browser/user_metrics.h"
23 #include "content/public/browser/web_contents.h"
24 #include "content/public/browser/web_ui.h"
25 #include "grit/chromium_strings.h"
26 #include "grit/generated_resources.h"
27 #include "net/base/net_util.h"
28 #include "ui/base/l10n/l10n_util.h"
29
30 namespace options {
31
PasswordManagerHandler()32 PasswordManagerHandler::PasswordManagerHandler()
33 : password_manager_presenter_(this) {}
34
~PasswordManagerHandler()35 PasswordManagerHandler::~PasswordManagerHandler() {}
36
GetProfile()37 Profile* PasswordManagerHandler::GetProfile() {
38 return Profile::FromWebUI(web_ui());
39 }
40
41 #if !defined(OS_ANDROID)
GetNativeWindow()42 gfx::NativeWindow PasswordManagerHandler::GetNativeWindow() {
43 return web_ui()->GetWebContents()->GetTopLevelNativeWindow();
44 }
45 #endif
46
GetLocalizedValues(base::DictionaryValue * localized_strings)47 void PasswordManagerHandler::GetLocalizedValues(
48 base::DictionaryValue* localized_strings) {
49 DCHECK(localized_strings);
50
51 static const OptionsStringResource resources[] = {
52 { "savedPasswordsTitle",
53 IDS_PASSWORDS_SHOW_PASSWORDS_TAB_TITLE },
54 { "passwordExceptionsTitle",
55 IDS_PASSWORDS_EXCEPTIONS_TAB_TITLE },
56 { "passwordSearchPlaceholder",
57 IDS_PASSWORDS_PAGE_SEARCH_PASSWORDS },
58 { "passwordShowButton",
59 IDS_PASSWORDS_PAGE_VIEW_SHOW_BUTTON },
60 { "passwordHideButton",
61 IDS_PASSWORDS_PAGE_VIEW_HIDE_BUTTON },
62 { "passwordsNoPasswordsDescription",
63 IDS_PASSWORDS_PAGE_VIEW_NO_PASSWORDS_DESCRIPTION },
64 { "passwordsNoExceptionsDescription",
65 IDS_PASSWORDS_PAGE_VIEW_NO_EXCEPTIONS_DESCRIPTION },
66 };
67
68 RegisterStrings(localized_strings, resources, arraysize(resources));
69 RegisterTitle(localized_strings, "passwordsPage",
70 IDS_PASSWORDS_EXCEPTIONS_WINDOW_TITLE);
71
72 localized_strings->SetString("passwordManagerLearnMoreURL",
73 chrome::kPasswordManagerLearnMoreURL);
74 bool disable_show_passwords = false;
75
76 #if defined(OS_WIN) && defined(USE_ASH)
77 // We disable the ability to show passwords when running in Windows Metro
78 // interface. This is because we cannot pop native Win32 dialogs from the
79 // Metro process.
80 // TODO(wfh): Revisit this if Metro usage grows.
81 if (chrome::IsNativeWindowInAsh(GetNativeWindow()))
82 disable_show_passwords = true;
83 #endif
84
85 localized_strings->SetBoolean("disableShowPasswords", disable_show_passwords);
86 }
87
RegisterMessages()88 void PasswordManagerHandler::RegisterMessages() {
89 web_ui()->RegisterMessageCallback(
90 "updatePasswordLists",
91 base::Bind(&PasswordManagerHandler::HandleUpdatePasswordLists,
92 base::Unretained(this)));
93 web_ui()->RegisterMessageCallback(
94 "removeSavedPassword",
95 base::Bind(&PasswordManagerHandler::HandleRemoveSavedPassword,
96 base::Unretained(this)));
97 web_ui()->RegisterMessageCallback(
98 "removePasswordException",
99 base::Bind(&PasswordManagerHandler::HandleRemovePasswordException,
100 base::Unretained(this)));
101 web_ui()->RegisterMessageCallback(
102 "requestShowPassword",
103 base::Bind(&PasswordManagerHandler::HandleRequestShowPassword,
104 base::Unretained(this)));
105 }
106
InitializeHandler()107 void PasswordManagerHandler::InitializeHandler() {
108 password_manager_presenter_.Initialize();
109 }
110
HandleRemoveSavedPassword(const base::ListValue * args)111 void PasswordManagerHandler::HandleRemoveSavedPassword(
112 const base::ListValue* args) {
113 std::string string_value = base::UTF16ToUTF8(ExtractStringValue(args));
114 int index;
115 if (base::StringToInt(string_value, &index) && index >= 0) {
116 password_manager_presenter_.RemoveSavedPassword(static_cast<size_t>(index));
117 }
118 }
119
HandleRemovePasswordException(const base::ListValue * args)120 void PasswordManagerHandler::HandleRemovePasswordException(
121 const base::ListValue* args) {
122 std::string string_value = base::UTF16ToUTF8(ExtractStringValue(args));
123 int index;
124 if (base::StringToInt(string_value, &index) && index >= 0) {
125 password_manager_presenter_.RemovePasswordException(
126 static_cast<size_t>(index));
127 }
128 }
129
HandleRequestShowPassword(const base::ListValue * args)130 void PasswordManagerHandler::HandleRequestShowPassword(
131 const base::ListValue* args) {
132 int index;
133 if (!ExtractIntegerValue(args, &index))
134 NOTREACHED();
135
136 password_manager_presenter_.RequestShowPassword(static_cast<size_t>(index));
137 }
138
ShowPassword(size_t index,const base::string16 & password_value)139 void PasswordManagerHandler::ShowPassword(
140 size_t index,
141 const base::string16& password_value) {
142 // Call back the front end to reveal the password.
143 web_ui()->CallJavascriptFunction(
144 "PasswordManager.showPassword",
145 base::FundamentalValue(static_cast<int>(index)),
146 base::StringValue(password_value));
147 }
148
HandleUpdatePasswordLists(const base::ListValue * args)149 void PasswordManagerHandler::HandleUpdatePasswordLists(
150 const base::ListValue* args) {
151 password_manager_presenter_.UpdatePasswordLists();
152 }
153
SetPasswordList(const ScopedVector<autofill::PasswordForm> & password_list,bool show_passwords)154 void PasswordManagerHandler::SetPasswordList(
155 const ScopedVector<autofill::PasswordForm>& password_list,
156 bool show_passwords) {
157 base::ListValue entries;
158 languages_ = GetProfile()->GetPrefs()->GetString(prefs::kAcceptLanguages);
159 base::string16 placeholder(base::ASCIIToUTF16(" "));
160 for (size_t i = 0; i < password_list.size(); ++i) {
161 base::ListValue* entry = new base::ListValue();
162 entry->Append(new base::StringValue(net::FormatUrl(password_list[i]->origin,
163 languages_)));
164 entry->Append(new base::StringValue(password_list[i]->username_value));
165 if (show_passwords) {
166 entry->Append(new base::StringValue(password_list[i]->password_value));
167 } else {
168 // Use a placeholder value with the same length as the password.
169 entry->Append(new base::StringValue(
170 base::string16(password_list[i]->password_value.length(), ' ')));
171 }
172 entries.Append(entry);
173 }
174
175 web_ui()->CallJavascriptFunction("PasswordManager.setSavedPasswordsList",
176 entries);
177 }
178
SetPasswordExceptionList(const ScopedVector<autofill::PasswordForm> & password_exception_list)179 void PasswordManagerHandler::SetPasswordExceptionList(
180 const ScopedVector<autofill::PasswordForm>& password_exception_list) {
181 base::ListValue entries;
182 for (size_t i = 0; i < password_exception_list.size(); ++i) {
183 entries.Append(new base::StringValue(
184 net::FormatUrl(password_exception_list[i]->origin, languages_)));
185 }
186
187 web_ui()->CallJavascriptFunction("PasswordManager.setPasswordExceptionsList",
188 entries);
189 }
190
191 } // namespace options
192