Commit 34bef18f authored by Vadym Doroshenko's avatar Vadym Doroshenko Committed by Commit Bot

Moving LogPasswordForm to the browser side logger.

This CL is a part of moving PasswordForm class to
components/password_manager/core/browser.

Bug: 1067347
Change-Id: Iebc89045547a3ea9293e794e7ee8ae43f36b6684
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2164611
Commit-Queue: Vadym Doroshenko  <dvadym@chromium.org>
Reviewed-by: default avatarMohamed Amir Yosef <mamir@chromium.org>
Cr-Commit-Position: refs/heads/master@{#762824}
parent dcc5ada8
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "components/autofill/core/common/password_form.h"
#include "components/autofill/core/common/signatures_util.h" #include "components/autofill/core/common/signatures_util.h"
using base::checked_cast; using base::checked_cast;
...@@ -34,78 +33,10 @@ bool IsUnwantedInElementID(char c) { ...@@ -34,78 +33,10 @@ bool IsUnwantedInElementID(char c) {
base::IsAsciiDigit(c)); base::IsAsciiDigit(c));
} }
SavePasswordProgressLogger::StringID FormSchemeToStringID(
PasswordForm::Scheme scheme) {
switch (scheme) {
case PasswordForm::Scheme::kHtml:
return SavePasswordProgressLogger::STRING_SCHEME_HTML;
case PasswordForm::Scheme::kBasic:
return SavePasswordProgressLogger::STRING_SCHEME_BASIC;
case PasswordForm::Scheme::kDigest:
return SavePasswordProgressLogger::STRING_SCHEME_DIGEST;
case PasswordForm::Scheme::kOther:
return SavePasswordProgressLogger::STRING_OTHER;
case PasswordForm::Scheme::kUsernameOnly:
return SavePasswordProgressLogger::STRING_SCHEME_USERNAME_ONLY;
}
NOTREACHED();
return SavePasswordProgressLogger::STRING_INVALID;
}
} // namespace } // namespace
SavePasswordProgressLogger::SavePasswordProgressLogger() {} SavePasswordProgressLogger::SavePasswordProgressLogger() = default;
SavePasswordProgressLogger::~SavePasswordProgressLogger() = default;
SavePasswordProgressLogger::~SavePasswordProgressLogger() {}
void SavePasswordProgressLogger::LogPasswordForm(
SavePasswordProgressLogger::StringID label,
const PasswordForm& form) {
DictionaryValue log;
log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE),
GetStringFromID(FormSchemeToStringID(form.scheme)));
log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE),
GetStringFromID(FormSchemeToStringID(form.scheme)));
log.SetString(GetStringFromID(STRING_SIGNON_REALM),
ScrubURL(GURL(form.signon_realm)));
log.SetString(GetStringFromID(STRING_ORIGIN), ScrubURL(form.origin));
log.SetString(GetStringFromID(STRING_ACTION), ScrubURL(form.action));
log.SetString(GetStringFromID(STRING_USERNAME_ELEMENT),
ScrubElementID(form.username_element));
if (form.has_renderer_ids) {
log.SetString(GetStringFromID(STRING_USERNAME_ELEMENT_RENDERER_ID),
NumberToString(form.username_element_renderer_id.value()));
}
log.SetString(GetStringFromID(STRING_PASSWORD_ELEMENT),
ScrubElementID(form.password_element));
if (form.has_renderer_ids) {
log.SetString(GetStringFromID(STRING_PASSWORD_ELEMENT_RENDERER_ID),
NumberToString(form.password_element_renderer_id.value()));
}
log.SetString(GetStringFromID(STRING_NEW_PASSWORD_ELEMENT),
ScrubElementID(form.new_password_element));
if (form.has_renderer_ids) {
log.SetString(
GetStringFromID(STRING_NEW_PASSWORD_ELEMENT_RENDERER_ID),
NumberToString(form.new_password_element_renderer_id.value()));
}
if (!form.confirmation_password_element.empty()) {
log.SetString(GetStringFromID(STRING_CONFIRMATION_PASSWORD_ELEMENT),
ScrubElementID(form.confirmation_password_element));
if (form.has_renderer_ids) {
log.SetString(
GetStringFromID(STRING_CONFIRMATION_PASSWORD_ELEMENT_RENDERER_ID),
NumberToString(
form.confirmation_password_element_renderer_id.value()));
}
}
log.SetBoolean(GetStringFromID(STRING_PASSWORD_GENERATED),
form.type == PasswordForm::Type::kGenerated);
log.SetInteger(GetStringFromID(STRING_TIMES_USED), form.times_used);
log.SetBoolean(GetStringFromID(STRING_PSL_MATCH),
form.is_public_suffix_match);
LogValue(label, log);
}
std::string FormSignatureToDebugString(autofill::FormSignature form_signature) { std::string FormSignatureToDebugString(autofill::FormSignature form_signature) {
return base::StrCat( return base::StrCat(
......
...@@ -19,8 +19,6 @@ class Value; ...@@ -19,8 +19,6 @@ class Value;
namespace autofill { namespace autofill {
struct PasswordForm;
// When logging decisions made by password management code about whether to // When logging decisions made by password management code about whether to
// offer user-entered credentials for saving or not, do use this class. It // offer user-entered credentials for saving or not, do use this class. It
// offers a suite of convenience methods to format and scrub logs. The methods // offers a suite of convenience methods to format and scrub logs. The methods
...@@ -169,7 +167,6 @@ class SavePasswordProgressLogger { ...@@ -169,7 +167,6 @@ class SavePasswordProgressLogger {
// Call these methods to log information. They sanitize the input and call // Call these methods to log information. They sanitize the input and call
// SendLog to pass it for display. // SendLog to pass it for display.
void LogPasswordForm(StringID label, const PasswordForm& form);
void LogFormData(StringID label, const FormData& form_data); void LogFormData(StringID label, const FormData& form_data);
void LogHTMLForm(StringID label, void LogHTMLForm(StringID label,
const std::string& name_or_id, const std::string& name_or_id,
......
...@@ -42,47 +42,6 @@ class TestLogger : public SavePasswordProgressLogger { ...@@ -42,47 +42,6 @@ class TestLogger : public SavePasswordProgressLogger {
} // namespace } // namespace
TEST(SavePasswordProgressLoggerTest, LogPasswordForm) {
TestLogger logger;
PasswordForm form;
form.action = GURL("http://example.org/verysecret?verysecret");
form.password_element = UTF8ToUTF16("pwdelement");
form.password_value = UTF8ToUTF16("verysecret");
form.username_value = UTF8ToUTF16("verysecret");
logger.LogPasswordForm(SavePasswordProgressLogger::STRING_MESSAGE, form);
SCOPED_TRACE(testing::Message() << "Log string = ["
<< logger.accumulated_log() << "]");
EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
EXPECT_TRUE(logger.LogsContainSubstring("pwdelement"));
EXPECT_TRUE(logger.LogsContainSubstring("http://example.org"));
EXPECT_FALSE(logger.LogsContainSubstring("verysecret"));
}
TEST(SavePasswordProgressLoggerTest, LogPasswordFormElementID) {
// Test filtering element IDs.
TestLogger logger;
PasswordForm form;
const std::string kHTMLInside("Username <script> element");
const std::string kHTMLInsideExpected("Username__script__element");
const std::string kIPAddressInside("y128.0.0.1Y");
const std::string kIPAddressInsideExpected("y128_0_0_1Y");
const std::string kSpecialCharsInside("X@#a$%B&*c()D;:e+!x");
const std::string kSpecialCharsInsideExpected("X__a__B__c__D__e__x");
form.username_element = UTF8ToUTF16(kHTMLInside);
form.password_element = UTF8ToUTF16(kIPAddressInside);
form.new_password_element = UTF8ToUTF16(kSpecialCharsInside);
logger.LogPasswordForm(SavePasswordProgressLogger::STRING_MESSAGE, form);
SCOPED_TRACE(testing::Message() << "Log string = ["
<< logger.accumulated_log() << "]");
EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
EXPECT_FALSE(logger.LogsContainSubstring(kHTMLInside));
EXPECT_TRUE(logger.LogsContainSubstring(kHTMLInsideExpected));
EXPECT_FALSE(logger.LogsContainSubstring(kIPAddressInside));
EXPECT_TRUE(logger.LogsContainSubstring(kIPAddressInsideExpected));
EXPECT_FALSE(logger.LogsContainSubstring(kSpecialCharsInside));
EXPECT_TRUE(logger.LogsContainSubstring(kSpecialCharsInsideExpected));
}
TEST(SavePasswordProgressLoggerTest, LogHTMLForm) { TEST(SavePasswordProgressLoggerTest, LogHTMLForm) {
TestLogger logger; TestLogger logger;
logger.LogHTMLForm(SavePasswordProgressLogger::STRING_MESSAGE, logger.LogHTMLForm(SavePasswordProgressLogger::STRING_MESSAGE,
......
...@@ -24,6 +24,7 @@ using autofill::AutofillUploadContents; ...@@ -24,6 +24,7 @@ using autofill::AutofillUploadContents;
using autofill::FieldPropertiesFlags; using autofill::FieldPropertiesFlags;
using autofill::FormStructure; using autofill::FormStructure;
using autofill::PasswordAttribute; using autofill::PasswordAttribute;
using autofill::PasswordForm;
using autofill::ServerFieldType; using autofill::ServerFieldType;
using base::NumberToString; using base::NumberToString;
...@@ -91,6 +92,24 @@ std::string FormSignatureToDebugString(autofill::FormSignature form_signature) { ...@@ -91,6 +92,24 @@ std::string FormSignatureToDebugString(autofill::FormSignature form_signature) {
PasswordFormMetricsRecorder::HashFormSignature(form_signature))}); PasswordFormMetricsRecorder::HashFormSignature(form_signature))});
} }
BrowserSavePasswordProgressLogger::StringID FormSchemeToStringID(
PasswordForm::Scheme scheme) {
switch (scheme) {
case PasswordForm::Scheme::kHtml:
return BrowserSavePasswordProgressLogger::STRING_SCHEME_HTML;
case PasswordForm::Scheme::kBasic:
return BrowserSavePasswordProgressLogger::STRING_SCHEME_BASIC;
case PasswordForm::Scheme::kDigest:
return BrowserSavePasswordProgressLogger::STRING_SCHEME_DIGEST;
case PasswordForm::Scheme::kOther:
return BrowserSavePasswordProgressLogger::STRING_OTHER;
case PasswordForm::Scheme::kUsernameOnly:
return BrowserSavePasswordProgressLogger::STRING_SCHEME_USERNAME_ONLY;
}
NOTREACHED();
return BrowserSavePasswordProgressLogger::STRING_INVALID;
}
} // namespace } // namespace
BrowserSavePasswordProgressLogger::BrowserSavePasswordProgressLogger( BrowserSavePasswordProgressLogger::BrowserSavePasswordProgressLogger(
...@@ -99,7 +118,8 @@ BrowserSavePasswordProgressLogger::BrowserSavePasswordProgressLogger( ...@@ -99,7 +118,8 @@ BrowserSavePasswordProgressLogger::BrowserSavePasswordProgressLogger(
DCHECK(log_manager_); DCHECK(log_manager_);
} }
BrowserSavePasswordProgressLogger::~BrowserSavePasswordProgressLogger() {} BrowserSavePasswordProgressLogger::~BrowserSavePasswordProgressLogger() =
default;
void BrowserSavePasswordProgressLogger::LogFormStructure( void BrowserSavePasswordProgressLogger::LogFormStructure(
StringID label, StringID label,
...@@ -255,6 +275,55 @@ void BrowserSavePasswordProgressLogger::LogSuccessfulSubmissionIndicatorEvent( ...@@ -255,6 +275,55 @@ void BrowserSavePasswordProgressLogger::LogSuccessfulSubmissionIndicatorEvent(
SendLog(message); SendLog(message);
} }
void BrowserSavePasswordProgressLogger::LogPasswordForm(
BrowserSavePasswordProgressLogger::StringID label,
const PasswordForm& form) {
base::DictionaryValue log;
log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE),
GetStringFromID(FormSchemeToStringID(form.scheme)));
log.SetString(GetStringFromID(STRING_SCHEME_MESSAGE),
GetStringFromID(FormSchemeToStringID(form.scheme)));
log.SetString(GetStringFromID(STRING_SIGNON_REALM),
ScrubURL(GURL(form.signon_realm)));
log.SetString(GetStringFromID(STRING_ORIGIN), ScrubURL(form.origin));
log.SetString(GetStringFromID(STRING_ACTION), ScrubURL(form.action));
log.SetString(GetStringFromID(STRING_USERNAME_ELEMENT),
ScrubElementID(form.username_element));
if (form.has_renderer_ids) {
log.SetString(GetStringFromID(STRING_USERNAME_ELEMENT_RENDERER_ID),
NumberToString(form.username_element_renderer_id.value()));
}
log.SetString(GetStringFromID(STRING_PASSWORD_ELEMENT),
ScrubElementID(form.password_element));
if (form.has_renderer_ids) {
log.SetString(GetStringFromID(STRING_PASSWORD_ELEMENT_RENDERER_ID),
NumberToString(form.password_element_renderer_id.value()));
}
log.SetString(GetStringFromID(STRING_NEW_PASSWORD_ELEMENT),
ScrubElementID(form.new_password_element));
if (form.has_renderer_ids) {
log.SetString(
GetStringFromID(STRING_NEW_PASSWORD_ELEMENT_RENDERER_ID),
NumberToString(form.new_password_element_renderer_id.value()));
}
if (!form.confirmation_password_element.empty()) {
log.SetString(GetStringFromID(STRING_CONFIRMATION_PASSWORD_ELEMENT),
ScrubElementID(form.confirmation_password_element));
if (form.has_renderer_ids) {
log.SetString(
GetStringFromID(STRING_CONFIRMATION_PASSWORD_ELEMENT_RENDERER_ID),
NumberToString(
form.confirmation_password_element_renderer_id.value()));
}
}
log.SetBoolean(GetStringFromID(STRING_PASSWORD_GENERATED),
form.type == PasswordForm::Type::kGenerated);
log.SetInteger(GetStringFromID(STRING_TIMES_USED), form.times_used);
log.SetBoolean(GetStringFromID(STRING_PSL_MATCH),
form.is_public_suffix_match);
LogValue(label, log);
}
void BrowserSavePasswordProgressLogger::SendLog(const std::string& log) { void BrowserSavePasswordProgressLogger::SendLog(const std::string& log) {
log_manager_->LogTextMessage(log); log_manager_->LogTextMessage(log);
} }
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
namespace autofill { namespace autofill {
class FormStructure; class FormStructure;
class LogManager; class LogManager;
struct PasswordForm;
} }
namespace password_manager { namespace password_manager {
...@@ -47,6 +48,8 @@ class BrowserSavePasswordProgressLogger ...@@ -47,6 +48,8 @@ class BrowserSavePasswordProgressLogger
void LogSuccessfulSubmissionIndicatorEvent( void LogSuccessfulSubmissionIndicatorEvent(
autofill::mojom::SubmissionIndicatorEvent event); autofill::mojom::SubmissionIndicatorEvent event);
void LogPasswordForm(StringID label, const autofill::PasswordForm& form);
protected: protected:
// autofill::SavePasswordProgressLogger: // autofill::SavePasswordProgressLogger:
void SendLog(const std::string& log) override; void SendLog(const std::string& log) override;
......
...@@ -15,12 +15,16 @@ ...@@ -15,12 +15,16 @@
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
using autofill::PasswordForm;
using base::UTF8ToUTF16;
using Logger = autofill::SavePasswordProgressLogger; using Logger = autofill::SavePasswordProgressLogger;
namespace password_manager { namespace password_manager {
namespace { namespace {
const char kTestString[] = "Message"; // Corresponds to STRING_MESSAGE.
class TestLogger : public BrowserSavePasswordProgressLogger { class TestLogger : public BrowserSavePasswordProgressLogger {
public: public:
explicit TestLogger(autofill::LogManager* log_manager) explicit TestLogger(autofill::LogManager* log_manager)
...@@ -95,4 +99,47 @@ TEST_F(BrowserSavePasswordProgressLoggerTest, LogFormData) { ...@@ -95,4 +99,47 @@ TEST_F(BrowserSavePasswordProgressLoggerTest, LogFormData) {
"email: type=text, renderer_id = 42, invisible, non-empty")); "email: type=text, renderer_id = 42, invisible, non-empty"));
} }
TEST(SavePasswordProgressLoggerTest, LogPasswordForm) {
MockLogManager log_manager;
TestLogger logger(&log_manager);
PasswordForm form;
form.action = GURL("http://example.org/verysecret?verysecret");
form.password_element = UTF8ToUTF16("pwdelement");
form.password_value = UTF8ToUTF16("verysecret");
form.username_value = UTF8ToUTF16("verysecret");
logger.LogPasswordForm(Logger::STRING_MESSAGE, form);
SCOPED_TRACE(testing::Message()
<< "Log string = [" << logger.accumulated_log() << "]");
EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
EXPECT_TRUE(logger.LogsContainSubstring("pwdelement"));
EXPECT_TRUE(logger.LogsContainSubstring("http://example.org"));
EXPECT_FALSE(logger.LogsContainSubstring("verysecret"));
}
TEST(SavePasswordProgressLoggerTest, LogPasswordFormElementID) {
// Test filtering element IDs.
MockLogManager log_manager;
TestLogger logger(&log_manager);
PasswordForm form;
const std::string kHTMLInside("Username <script> element");
const std::string kHTMLInsideExpected("Username__script__element");
const std::string kIPAddressInside("y128.0.0.1Y");
const std::string kIPAddressInsideExpected("y128_0_0_1Y");
const std::string kSpecialCharsInside("X@#a$%B&*c()D;:e+!x");
const std::string kSpecialCharsInsideExpected("X__a__B__c__D__e__x");
form.username_element = UTF8ToUTF16(kHTMLInside);
form.password_element = UTF8ToUTF16(kIPAddressInside);
form.new_password_element = UTF8ToUTF16(kSpecialCharsInside);
logger.LogPasswordForm(Logger::STRING_MESSAGE, form);
SCOPED_TRACE(testing::Message()
<< "Log string = [" << logger.accumulated_log() << "]");
EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
EXPECT_FALSE(logger.LogsContainSubstring(kHTMLInside));
EXPECT_TRUE(logger.LogsContainSubstring(kHTMLInsideExpected));
EXPECT_FALSE(logger.LogsContainSubstring(kIPAddressInside));
EXPECT_TRUE(logger.LogsContainSubstring(kIPAddressInsideExpected));
EXPECT_FALSE(logger.LogsContainSubstring(kSpecialCharsInside));
EXPECT_TRUE(logger.LogsContainSubstring(kSpecialCharsInsideExpected));
}
} // namespace password_manager } // namespace password_manager
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment