// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/lacros/account_manager/account_manager_util.h"
#include <utility>
#include <vector>
#include "base/containers/flat_set.h"
#include "base/functional/bind.h"
#include "base/ranges/algorithm.h"
#include "chrome/browser/profiles/profile_attributes_entry.h"
#include "chrome/browser/profiles/profile_attributes_storage.h"
#include "chrome/browser/profiles/profile_manager.h"
namespace {
void GetAccountsNotDenylisted(
const std::map<base::FilePath, std::vector<account_manager::Account>>&
accounts_map,
const base::flat_set<std::string>& denylisted_gaia_ids,
AccountProfileMapper::ListAccountsCallback callback) {
std::vector<account_manager::Account> result;
// Copy all accounts into result, except for those denylisted.
for (const auto& path_and_list_pair : accounts_map) {
base::ranges::copy_if(
path_and_list_pair.second, std::back_inserter(result),
[&denylisted_gaia_ids](const account_manager::Account& account) {
return !denylisted_gaia_ids.contains(account.key.id());
});
}
std::move(callback).Run(result);
}
void GetAllAvailableAccountsImpl(
const base::FilePath& profile_path,
AccountProfileMapper::ListAccountsCallback callback,
const std::map<base::FilePath, std::vector<account_manager::Account>>&
accounts_map) {
auto it = accounts_map.find(profile_path);
if (profile_path.empty() || it == accounts_map.end()) {
// When empty or invalid profile path is given, return all accounts.
GetAccountsNotDenylisted(accounts_map, {}, std::move(callback));
return;
}
// Put the gaia ids of all the accounts in the given profile into a flat set.
const std::vector<account_manager::Account>& accounts = it->second;
auto profile_gaia_ids = base::MakeFlatSet<std::string>(
accounts, {},
[](const account_manager::Account& account) { return account.key.id(); });
GetAccountsNotDenylisted(accounts_map, profile_gaia_ids, std::move(callback));
}
} // namespace
void GetAllAvailableAccounts(
AccountProfileMapper* mapper,
const base::FilePath& profile_path,
AccountProfileMapper::ListAccountsCallback callback) {
DCHECK(mapper);
DCHECK(callback);
DCHECK_NE(profile_path, ProfileManager::GetGuestProfilePath());
DCHECK_NE(profile_path, ProfileManager::GetSystemProfilePath());
mapper->GetAccountsMap(base::BindOnce(&GetAllAvailableAccountsImpl,
profile_path, std::move(callback)));
}