blob: 9b45e711f9c368376a933450b3577bf1ca4f0222 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/password_manager/core/browser/import/password_importer.h"
#include "base/bind.h"
#include "base/files/file_util.h"
#include "base/location.h"
#include "base/optional.h"
#include "base/task/post_task.h"
#include "components/autofill/core/common/password_form.h"
#include "components/password_manager/core/browser/import/password_csv_reader.h"
namespace password_manager {
namespace {
// Preferred filename extension for the imported files.
const base::FilePath::CharType kFileExtension[] = FILE_PATH_LITERAL("csv");
// Reads and returns the contents of the file at |path| as a string, or returns
// a null value on error.
base::Optional<std::string> ReadFileToString(const base::FilePath& path) {
std::string contents;
if (!base::ReadFileToString(path, &contents))
return base::Optional<std::string>();
return contents;
}
// Parses passwords from |input| using |password_reader| and synchronously calls
// |completion| with the results.
static void ParsePasswords(
const PasswordImporter::CompletionCallback& completion,
base::Optional<std::string> input) {
// Currently, CSV is the only supported format.
PasswordCSVReader password_reader;
std::vector<autofill::PasswordForm> passwords;
PasswordImporter::Result result = PasswordImporter::IO_ERROR;
if (input)
result = password_reader.DeserializePasswords(input.value(), &passwords);
completion.Run(result, passwords);
}
} // namespace
// static
void PasswordImporter::Import(const base::FilePath& path,
const CompletionCallback& completion) {
// Posting with USER_VISIBLE priority, because the result of the import is
// visible to the user in the password settings page.
base::PostTaskWithTraitsAndReplyWithResult(
FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock()},
base::Bind(&ReadFileToString, path),
base::Bind(&ParsePasswords, completion));
}
// static
std::vector<std::vector<base::FilePath::StringType>>
PasswordImporter::GetSupportedFileExtensions() {
return std::vector<std::vector<base::FilePath::StringType>>(
1, std::vector<base::FilePath::StringType>(1, kFileExtension));
}
} // namespace password_manager