1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/autofill/core/common/save_password_progress_logger.h" 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <algorithm> 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/json/json_writer.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/logging.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/numerics/safe_conversions.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/string16.h" 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/string_util.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/utf_string_conversions.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/values.h" 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/autofill/core/common/password_form.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::checked_cast; 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::Value; 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::DictionaryValue; 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::FundamentalValue; 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing base::StringValue; 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace autofill { 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Note 1: Caching the ID->string map in an array would be probably faster, but 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// the switch statement is (a) robust against re-ordering, and (b) checks in 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// compile-time, that all IDs get a string assigned. The expected frequency of 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// calls is low enough (in particular, zero if password manager internals page 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// is not open), that optimizing for code robustness is preferred against speed. 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Note 2: The messages can be used as dictionary keys. Do not use '.' in them. 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string GetStringFromID(SavePasswordProgressLogger::StringID id) { 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch switch (id) { 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_DECISION_ASK: 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Decision: ASK the user"; 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_DECISION_DROP: 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Decision: DROP the password"; 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_DECISION_SAVE: 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Decision: SAVE the password"; 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_METHOD: 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Form method"; 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_METHOD_GET: 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "GET"; 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_METHOD_POST: 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "POST"; 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_METHOD_EMPTY: 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "(empty)"; 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_OTHER: 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "(other)"; 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_SCHEME_HTML: 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "HTML"; 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_SCHEME_BASIC: 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Basic"; 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_SCHEME_DIGEST: 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Digest"; 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_SCHEME_MESSAGE: 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Scheme"; 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_SIGNON_REALM: 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Signon realm"; 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_ORIGINAL_SIGNON_REALM: 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Original signon realm"; 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_ORIGIN: 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Origin"; 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_ACTION: 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Action"; 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_USERNAME_ELEMENT: 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Username element"; 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_PASSWORD_ELEMENT: 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Password element"; 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_PASSWORD_AUTOCOMPLETE_SET: 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Password autocomplete set"; 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_OLD_PASSWORD_ELEMENT: 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Old password element"; 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_SSL_VALID: 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "SSL valid"; 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_PASSWORD_GENERATED: 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Password generated"; 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_TIMES_USED: 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Times used"; 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_USE_ADDITIONAL_AUTHENTICATION: 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Use additional authentication"; 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_PSL_MATCH: 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "PSL match"; 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_NAME_OR_ID: 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Form name or ID"; 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_MESSAGE: 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "Message"; 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_SET_AUTH_METHOD: 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "LoginHandler::SetAuth"; 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_AUTHENTICATION_HANDLED: 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Authentication already handled"; 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_LOGINHANDLER_FORM: 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "LoginHandler reports this form"; 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_SEND_PASSWORD_FORMS_METHOD: 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "PasswordAutofillAgent::SendPasswordForms"; 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_SECURITY_ORIGIN: 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Security origin"; 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_SECURITY_ORIGIN_FAILURE: 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Security origin cannot access password manager."; 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_WEBPAGE_EMPTY: 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Webpage is empty."; 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_NUMBER_OF_ALL_FORMS: 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Number of all forms"; 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_FORM_FOUND_ON_PAGE: 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Form found on page"; 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_FORM_IS_VISIBLE: 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Form is visible"; 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_FORM_IS_PASSWORD: 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Form is a password form"; 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_WILL_SUBMIT_FORM_METHOD: 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "PasswordAutofillAgent::WillSubmitForm"; 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_HTML_FORM_FOR_SUBMIT: 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "HTML form for submit"; 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_CREATED_PASSWORD_FORM: 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Created PasswordForm"; 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_SUBMITTED_PASSWORD_REPLACED: 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Submitted password replaced with the provisionally saved one."; 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_DID_START_PROVISIONAL_LOAD_METHOD: 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "PasswordAutofillAgent::DidStartProvisionalLoad"; 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_FORM_FRAME_EQ_FRAME: 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "form_frame == frame"; 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVED_FORM_FOR_FRAME: 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "provisionally_saved_forms_[form_frame]"; 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_PASSWORD_FORM_FOUND_ON_PAGE: 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "PasswordForm found on the page"; 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVE_PASSWORD_METHOD: 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "PasswordManager::ProvisionallySavePassword"; 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVE_PASSWORD_FORM: 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "ProvisionallySavePassword form"; 1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_IS_SAVING_ENABLED: 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return "IsSavingEnabledForCurrentPage"; 1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_EMPTY_PASSWORD: 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Empty password"; 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_EXACT_MATCH: 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Form manager found, exact match."; 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_MATCH_WITHOUT_ACTION: 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Form manager found, match except for action."; 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_NO_FORM_MANAGER: 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "No form manager found."; 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_FORM_BLACKLISTED: 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Form blacklisted."; 1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_INVALID_FORM: 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Invalid form."; 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_AUTOCOMPLETE_OFF: 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Autocomplete=off."; 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_PROVISIONALLY_SAVED_FORM: 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "provisionally_saved_form"; 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_IGNORE_POSSIBLE_USERNAMES: 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Ignore other possible usernames"; 1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_ON_PASSWORD_FORMS_RENDERED_METHOD: 1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "PasswordManager::OnPasswordFormsRendered"; 1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_NO_PROVISIONAL_SAVE_MANAGER: 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "No provisional save manager"; 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_NUMBER_OF_VISIBLE_FORMS: 1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Number of visible forms"; 1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_PASSWORD_FORM_REAPPEARED: 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Password form re-appeared"; 1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_SAVING_DISABLED: 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "Saving disabled"; 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case SavePasswordProgressLogger::STRING_NO_MATCHING_FORM: 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return "No matching form"; 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case SavePasswordProgressLogger::STRING_SSL_ERRORS_PRESENT: 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return "SSL errors present"; 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case SavePasswordProgressLogger::STRING_ONLY_VISIBLE: 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return "only_visible"; 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case SavePasswordProgressLogger::STRING_INVALID: 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return "INVALID"; 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Intentionally no default: clause here -- all IDs need to get covered. 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NOTREACHED(); // Win compilers don't believe this is unreachable. 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return std::string(); 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Removes privacy sensitive parts of |url| (currently all but host and scheme). 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string ScrubURL(const GURL& url) { 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (url.is_valid()) 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return url.GetWithEmptyPath().spec(); 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return std::string(); 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Returns true for all characters which we don't want to see in the logged IDs 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// or names of HTML elements. 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool IsUnwantedInElementID(char c) { 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return !(c == '_' || c == '-' || IsAsciiAlpha(c) || IsAsciiDigit(c)); 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Replaces all characters satisfying IsUnwantedInElementID by a ' ', and turns 1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// all characters to lowercase. This damages some valid HTML element IDs or 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// names, but it is likely that it will be still possible to match the scrubbed 1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// string to the original ID or name in the HTML doc. That's good enough for the 1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// logging purposes, and provides some security benefits. 1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string ScrubElementID(std::string element_id) { 1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::replace_if( 1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch element_id.begin(), element_id.end(), IsUnwantedInElementID, ' '); 1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return StringToLowerASCII(element_id); 1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string ScrubElementID(const base::string16& element_id) { 2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return ScrubElementID(base::UTF16ToUTF8(element_id)); 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string FormSchemeToString(PasswordForm::Scheme scheme) { 2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID result_id = 2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::STRING_INVALID; 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch switch (scheme) { 208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case PasswordForm::SCHEME_HTML: 2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = SavePasswordProgressLogger::STRING_SCHEME_HTML; 2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case PasswordForm::SCHEME_BASIC: 2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = SavePasswordProgressLogger::STRING_SCHEME_BASIC; 2130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case PasswordForm::SCHEME_DIGEST: 2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = SavePasswordProgressLogger::STRING_SCHEME_DIGEST; 2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case PasswordForm::SCHEME_OTHER: 2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = SavePasswordProgressLogger::STRING_OTHER; 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return GetStringFromID(result_id); 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstd::string FormMethodToString(const std::string& method) { 2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string method_processed; 2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::TrimWhitespaceASCII( 2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch StringToLowerASCII(method), base::TRIM_ALL, &method_processed); 2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID result_id = 2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::STRING_OTHER; 2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (method_processed.empty()) 2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = SavePasswordProgressLogger::STRING_METHOD_EMPTY; 2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch else if (method_processed == "get") 2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = SavePasswordProgressLogger::STRING_METHOD_GET; 2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch else if (method_processed == "post") 2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result_id = SavePasswordProgressLogger::STRING_METHOD_POST; 2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return GetStringFromID(result_id); 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2410529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSavePasswordProgressLogger::SavePasswordProgressLogger() { 2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2440529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochSavePasswordProgressLogger::~SavePasswordProgressLogger() { 2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogPasswordForm( 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID label, 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const PasswordForm& form) { 250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DictionaryValue log; 2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE), 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FormSchemeToString(form.scheme)); 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE), 2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FormSchemeToString(form.scheme)); 2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_SIGNON_REALM), 2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScrubURL(GURL(form.signon_realm))); 2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_ORIGINAL_SIGNON_REALM), 258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ScrubURL(GURL(form.original_signon_realm))); 2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_ORIGIN), ScrubURL(form.origin)); 2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_ACTION), ScrubURL(form.action)); 2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_USERNAME_ELEMENT), 2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScrubElementID(form.username_element)); 2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_PASSWORD_ELEMENT), 2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScrubElementID(form.password_element)); 2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetBoolean(GetStringFromID(STRING_PASSWORD_AUTOCOMPLETE_SET), 2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch form.password_autocomplete_set); 2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_OLD_PASSWORD_ELEMENT), 2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ScrubElementID(form.old_password_element)); 2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetBoolean(GetStringFromID(STRING_SSL_VALID), form.ssl_valid); 2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetBoolean(GetStringFromID(STRING_PASSWORD_GENERATED), 271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch form.type == PasswordForm::TYPE_GENERATED); 2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetInteger(GetStringFromID(STRING_TIMES_USED), form.times_used); 2730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetBoolean(GetStringFromID(STRING_USE_ADDITIONAL_AUTHENTICATION), 274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch form.use_additional_authentication); 2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetBoolean(GetStringFromID(STRING_PSL_MATCH), form.IsPublicSuffixMatch()); 2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LogValue(label, log); 277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogHTMLForm( 2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID label, 2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::string& name_or_id, 2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::string& method, 2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& action) { 284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DictionaryValue log; 2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_NAME_OR_ID), ScrubElementID(name_or_id)); 2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_METHOD), FormMethodToString(method)); 2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch log.SetString(GetStringFromID(STRING_ACTION), ScrubURL(action)); 2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LogValue(label, log); 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogURL( 2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID label, 2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& url) { 2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LogValue(label, StringValue(ScrubURL(url))); 295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogBoolean( 2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID label, 2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool truth_value) { 3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LogValue(label, FundamentalValue(truth_value)); 301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogNumber( 3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID label, 3050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int signed_number) { 3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LogValue(label, FundamentalValue(signed_number)); 307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogNumber( 3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID label, 3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t unsigned_number) { 3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int signed_number = checked_cast<int, size_t>(unsigned_number); 3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LogNumber(label, signed_number); 314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogMessage( 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SavePasswordProgressLogger::StringID message) { 3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LogValue(STRING_MESSAGE, StringValue(GetStringFromID(message))); 319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid SavePasswordProgressLogger::LogValue(StringID label, const Value& log) { 322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string log_string; 323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool conversion_to_string_successful = base::JSONWriter::WriteWithOptions( 324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &log, base::JSONWriter::OPTIONS_PRETTY_PRINT, &log_string); 325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(conversion_to_string_successful); 3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SendLog(GetStringFromID(label) + ": " + log_string); 327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace autofill 330