blob: b40813797e447d52b8a04370261f41a44a51c43b [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/data_sharing/public/data_sharing_utils.h"
#include "components/data_sharing/public/features.h"
#include "net/base/url_util.h"
namespace data_sharing {
namespace {
constexpr char kGroupIdKey[] = "g";
constexpr char kTokenBlobKey[] = "t";
} // namespace
std::optional<bool> DataSharingUtils::should_intercept_for_testing_ =
std::nullopt;
// static
bool DataSharingUtils::ShouldInterceptNavigationForShareURL(const GURL& url) {
if (should_intercept_for_testing_.has_value()) {
return should_intercept_for_testing_.value();
}
ParseUrlResult result = ParseDataSharingUrl(url);
if (result.has_value()) {
return true;
}
switch (result.error()) {
case ParseUrlStatus::kUnknown:
case ParseUrlStatus::kHostOrPathMismatchFailure:
return false;
case ParseUrlStatus::kQueryMissingFailure:
case ParseUrlStatus::kSuccess:
return true;
}
}
// static
ParseUrlResult DataSharingUtils::ParseDataSharingUrl(const GURL& url) {
GURL data_sharing_url = GURL(data_sharing::features::kDataSharingURL.Get());
if (url.host() != data_sharing_url.host() ||
url.path() != data_sharing_url.path()) {
return base::unexpected(ParseUrlStatus::kHostOrPathMismatchFailure);
}
std::string group_id;
std::string access_token;
if (!net::GetValueForKeyInQuery(url, kGroupIdKey, &group_id)) {
group_id.clear();
}
if (!net::GetValueForKeyInQuery(url, kTokenBlobKey, &access_token)) {
access_token.clear();
}
if (group_id.empty()) {
return base::unexpected(ParseUrlStatus::kQueryMissingFailure);
}
return base::ok(GroupToken(GroupId(group_id), access_token));
}
// static
void DataSharingUtils::SetShouldInterceptForTesting(
std::optional<bool> should_intercept_for_testing) {
should_intercept_for_testing_ = should_intercept_for_testing;
}
} // namespace data_sharing