| // 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 |