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 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "components/autofill/core/common/password_form.h"
#include "components/autofill/core/common/signatures_util.h"
using base::checked_cast;
......@@ -34,78 +33,10 @@ bool IsUnwantedInElementID(char 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
SavePasswordProgressLogger::SavePasswordProgressLogger() {}
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);
}
SavePasswordProgressLogger::SavePasswordProgressLogger() = default;
SavePasswordProgressLogger::~SavePasswordProgressLogger() = default;
std::string FormSignatureToDebugString(autofill::FormSignature form_signature) {
return base::StrCat(
......
......@@ -19,8 +19,6 @@ class Value;
namespace autofill {
struct PasswordForm;
// When logging decisions made by password management code about whether to
// 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
......@@ -169,7 +167,6 @@ class SavePasswordProgressLogger {
// Call these methods to log information. They sanitize the input and call
// SendLog to pass it for display.
void LogPasswordForm(StringID label, const PasswordForm& form);
void LogFormData(StringID label, const FormData& form_data);
void LogHTMLForm(StringID label,
const std::string& name_or_id,
......
......@@ -42,47 +42,6 @@ class TestLogger : public SavePasswordProgressLogger {
} // 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) {
TestLogger logger;
logger.LogHTMLForm(SavePasswordProgressLogger::STRING_MESSAGE,
......
......@@ -24,6 +24,7 @@ using autofill::AutofillUploadContents;
using autofill::FieldPropertiesFlags;
using autofill::FormStructure;
using autofill::PasswordAttribute;
using autofill::PasswordForm;
using autofill::ServerFieldType;
using base::NumberToString;
......@@ -91,6 +92,24 @@ std::string FormSignatureToDebugString(autofill::FormSignature 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
BrowserSavePasswordProgressLogger::BrowserSavePasswordProgressLogger(
......@@ -99,7 +118,8 @@ BrowserSavePasswordProgressLogger::BrowserSavePasswordProgressLogger(
DCHECK(log_manager_);
}
BrowserSavePasswordProgressLogger::~BrowserSavePasswordProgressLogger() {}
BrowserSavePasswordProgressLogger::~BrowserSavePasswordProgressLogger() =
default;
void BrowserSavePasswordProgressLogger::LogFormStructure(
StringID label,
......@@ -255,6 +275,55 @@ void BrowserSavePasswordProgressLogger::LogSuccessfulSubmissionIndicatorEvent(
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) {
log_manager_->LogTextMessage(log);
}
......
......@@ -16,6 +16,7 @@
namespace autofill {
class FormStructure;
class LogManager;
struct PasswordForm;
}
namespace password_manager {
......@@ -47,6 +48,8 @@ class BrowserSavePasswordProgressLogger
void LogSuccessfulSubmissionIndicatorEvent(
autofill::mojom::SubmissionIndicatorEvent event);
void LogPasswordForm(StringID label, const autofill::PasswordForm& form);
protected:
// autofill::SavePasswordProgressLogger:
void SendLog(const std::string& log) override;
......
......@@ -15,12 +15,16 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using autofill::PasswordForm;
using base::UTF8ToUTF16;
using Logger = autofill::SavePasswordProgressLogger;
namespace password_manager {
namespace {
const char kTestString[] = "Message"; // Corresponds to STRING_MESSAGE.
class TestLogger : public BrowserSavePasswordProgressLogger {
public:
explicit TestLogger(autofill::LogManager* log_manager)
......@@ -95,4 +99,47 @@ TEST_F(BrowserSavePasswordProgressLoggerTest, LogFormData) {
"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
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