blob: 56003cc426ef5a6bbf77a477cf50b8d209083431 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/contextual_tasks/internal/account_utils.h"
#include "base/strings/string_number_conversions.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "net/base/url_util.h"
#include "third_party/re2/src/re2/re2.h"
namespace contextual_tasks {
std::optional<size_t> GetUserIndex(const GURL& url) {
const re2::RE2 kUserPathRegex{"/u/(\\d+)/"};
int account_id = 0;
if (re2::RE2::PartialMatch(url.path(), kUserPathRegex, &account_id)) {
return account_id;
}
std::string account_id_str;
if (net::GetValueForKeyInQuery(url, "authuser", &account_id_str) &&
base::StringToInt(account_id_str, &account_id)) {
return account_id;
}
return std::nullopt;
}
CoreAccountInfo GetPrimaryAccountInfoFromProfile(
signin::IdentityManager* identity_manager) {
if (!identity_manager) {
return CoreAccountInfo();
}
return identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
}
std::optional<gaia::ListedAccount> GetAccountFromCookieJar(
signin::IdentityManager* identity_manager,
const GURL& url) {
if (!identity_manager) {
return std::nullopt;
}
auto accounts_in_cookie_jar = identity_manager->GetAccountsInCookieJar();
const std::vector<gaia::ListedAccount>& accounts =
accounts_in_cookie_jar.GetAllAccounts();
if (accounts.empty()) {
return std::nullopt;
}
std::optional<size_t> user_index = GetUserIndex(url);
if (!user_index.has_value()) {
return accounts[0];
}
if (*user_index >= accounts.size()) {
return std::nullopt;
}
return accounts[*user_index];
}
bool IsUrlForPrimaryAccount(signin::IdentityManager* identity_manager,
const GURL& url) {
CoreAccountInfo primary_account =
GetPrimaryAccountInfoFromProfile(identity_manager);
if (primary_account.IsEmpty()) {
return false;
}
std::optional<gaia::ListedAccount> account_from_url =
GetAccountFromCookieJar(identity_manager, url);
if (!account_from_url.has_value()) {
return false;
}
return primary_account.gaia == account_from_url->gaia_id;
}
} // namespace contextual_tasks