| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_SSL_HTTPS_UPGRADES_UTIL_H_ |
| #define CHROME_BROWSER_SSL_HTTPS_UPGRADES_UTIL_H_ |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/memory/stack_allocated.h" |
| #include "base/values.h" |
| #include "components/security_interstitials/core/https_only_mode_metrics.h" |
| #include "services/metrics/public/cpp/ukm_builders.h" |
| #include "services/metrics/public/cpp/ukm_recorder.h" |
| #include "url/gurl.h" |
| |
| class PrefService; |
| class Profile; |
| |
| namespace content { |
| class WebContents; |
| } |
| |
| // Helper for applying the HttpAllowlist enterprise policy. Checks if the |
| // hostname of `url` matches any of the hostnames or hostname patterns in the |
| // `allowed_hosts` list. Does not allow blanket host wildcards (i.e., "*" which |
| // matches all hosts), but does allow partial domain wildcards (e.g., |
| // "[*.]example.com"). Entries in `allowed_hosts` should follow the rules in |
| // https://chromeenterprise.google/policies/url-patterns/ (or they'll be |
| // ignored). |
| bool IsHostnameInHttpAllowlist(const GURL& url, PrefService* prefs); |
| |
| // Adds `hostnames` to the HttpAllowlist enterprise policy for testing. |
| // Expects the allowlist to be empty before updating it. |
| void AllowHttpForHostnamesForTesting(const std::vector<std::string>& hostnames, |
| PrefService* prefs); |
| |
| // Clears HttpAllowlist enterprise policy for testing. |
| void ClearHttpAllowlistForHostnamesForTesting(PrefService* prefs); |
| |
| // Computes the HttpInterstitialState for the given WebContents and URL being |
| // navigated to. |
| security_interstitials::https_only_mode::HttpInterstitialState |
| ComputeInterstitialState(content::WebContents* web_contents, const GURL& url); |
| |
| // Returns true if the HTTPS-First Balanced Mode feature flag is enabled. |
| bool IsBalancedModeAvailable(); |
| |
| // Returns true if HTTPS-First Balanced Mode is enabled by the user's selection |
| // in security settings. |
| bool IsBalancedModeEnabled(PrefService* prefs); |
| |
| // Returns true if the HTTPS-First Mode interstitial is enabled globally by the |
| // UI pref or by one of the Site Engagement and Typically Secure User |
| // heuristics. |
| bool IsInterstitialEnabled( |
| const security_interstitials::https_only_mode::HttpInterstitialState& |
| state); |
| |
| // Same as IsInterstitialEnabled, but excludes HFM variants (notably, 'balanced' |
| // mode) that should not trigger on captive portals or similar exclusions. |
| bool IsStrictInterstitialEnabled( |
| const security_interstitials::https_only_mode::HttpInterstitialState& |
| state); |
| |
| // Returns true if non-unique hostnames should be exempted from warnings. |
| // Different feature variations have different strictness levels on what to warn |
| // the user about. |
| bool ShouldExemptNonUniqueHostnames( |
| const security_interstitials::https_only_mode::HttpInterstitialState& |
| state); |
| |
| // Returns true if the given URL should be excluded from interstitials in the |
| // current HFM mode. Does NOT mean that an upgrade shouldn't be attempted. |
| bool ShouldExcludeUrlFromInterstitial( |
| const security_interstitials::https_only_mode::HttpInterstitialState& state, |
| const GURL& url); |
| |
| // Returns true if the Site Engagement heuristic for HTTPS-First Mode must be |
| // disabled and not cause an interstitial. Other conditions such as relevant |
| // prefs already having been set may also disable the heuristic on startup, but |
| // this is the bare minimum that must be checked. |
| bool MustDisableSiteEngagementHeuristic(Profile* profile); |
| |
| // Returns true if the Typically Secure User heuristic for HTTPS-First Mode must |
| // be disabled and not cause an interstitial. Other conditions such as relevant |
| // prefs already having been set may also disable the heuristic on startup, but |
| // this is the bare minimum that must be checked. |
| bool MustDisableTypicallySecureUserHeuristic(Profile* profile); |
| |
| void RecordHttpsFirstModeUKM( |
| ukm::SourceId source_id, |
| security_interstitials::https_only_mode::BlockingResult result); |
| |
| // An instance of this class adds `hostnames` to the HttpAllowlist enterprise |
| // policy for testing and clears the allowlist when it goes out of scope. |
| class ScopedAllowHttpForHostnamesForTesting { |
| STACK_ALLOCATED(); |
| |
| public: |
| explicit ScopedAllowHttpForHostnamesForTesting( |
| const std::vector<std::string>& hostnames, |
| PrefService* prefs); |
| ScopedAllowHttpForHostnamesForTesting( |
| const ScopedAllowHttpForHostnamesForTesting&) = delete; |
| ScopedAllowHttpForHostnamesForTesting& operator=( |
| const ScopedAllowHttpForHostnamesForTesting&) = delete; |
| |
| ~ScopedAllowHttpForHostnamesForTesting(); |
| |
| private: |
| raw_ptr<PrefService> prefs_; |
| }; |
| |
| #endif // CHROME_BROWSER_SSL_HTTPS_UPGRADES_UTIL_H_ |