Commit 394c077f authored by Vaclav Brozek's avatar Vaclav Brozek Committed by Commit Bot

Unescape CSV values in CSVPassword

This CL teaches CSVPassword to unescape CSV values.

Bug: 934326
Change-Id: Id99e89b6e84f9b47216e6eac0f735fc4084a9cb9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1698403Reviewed-by: default avatarJan Wilken Dörrie <jdoerrie@chromium.org>
Commit-Queue: Vaclav Brozek <vabr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#682353}
parent a300888e
...@@ -17,6 +17,19 @@ namespace password_manager { ...@@ -17,6 +17,19 @@ namespace password_manager {
using ::autofill::PasswordForm; using ::autofill::PasswordForm;
namespace {
// Convert() unescapes a CSV field |str| and converts the result to a 16-bit
// string. |str| is assumed to exclude the outer pair of quotation marks, if
// originally present.
base::string16 Convert(base::StringPiece str) {
std::string str_copy(str);
base::ReplaceSubstringsAfterOffset(&str_copy, 0, "\"\"", "\"");
return base::UTF8ToUTF16(str_copy);
}
} // namespace
CSVPassword::CSVPassword(const ColumnMap& map, base::StringPiece csv_row) CSVPassword::CSVPassword(const ColumnMap& map, base::StringPiece csv_row)
: map_(map), row_(csv_row) {} : map_(map), row_(csv_row) {}
...@@ -74,8 +87,8 @@ bool CSVPassword::Parse(PasswordForm* form) const { ...@@ -74,8 +87,8 @@ bool CSVPassword::Parse(PasswordForm* form) const {
? origin.spec() ? origin.spec()
: origin.GetOrigin().spec(); : origin.GetOrigin().spec();
form->origin = std::move(origin); form->origin = std::move(origin);
form->username_value = base::UTF8ToUTF16(username); form->username_value = Convert(username);
form->password_value = base::UTF8ToUTF16(password); form->password_value = Convert(password);
return true; return true;
} }
......
...@@ -147,6 +147,16 @@ INSTANTIATE_TEST_SUITE_P( ...@@ -147,6 +147,16 @@ INSTANTIATE_TEST_SUITE_P(
.Username("the-user") .Username("the-user")
.Password("pwd") .Password("pwd")
.Build(), .Build(),
TestCaseBuilder("Escaped")
.Map({{0, CSVPassword::Label::kOrigin},
{2, CSVPassword::Label::kUsername},
{3, CSVPassword::Label::kPassword}})
.CSV(R"(http://example.org,"a""b","u,+,c","p""")")
.Origin("http://example.org")
.SignonRealm("http://example.org/")
.Username("u,+,c")
.Password("p\"")
.Build(),
TestCaseBuilder("path discarded") TestCaseBuilder("path discarded")
.Map({{2, CSVPassword::Label::kOrigin}, .Map({{2, CSVPassword::Label::kOrigin},
{1, CSVPassword::Label::kUsername}, {1, CSVPassword::Label::kUsername},
......
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