blob: 6ab0fc952df995c747efb075a58d3c922d47b7cc [file] [log] [blame]
// Copyright 2024 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/facilitated_payments/content/browser/security_checker.h"
#include "base/check.h"
#include "base/command_line.h"
#include "components/network_session_configurator/common/network_switches.h"
#include "components/security_state/content/content_utils.h"
#include "components/security_state/core/security_state.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "services/network/public/cpp/is_potentially_trustworthy.h"
#include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
#include "url/gurl.h"
namespace payments::facilitated {
SecurityChecker::SecurityChecker() = default;
SecurityChecker::~SecurityChecker() = default;
bool SecurityChecker::IsSecureForPaymentLinkHandling(
content::RenderFrameHost& rfh) {
const GURL& last_committed_url = rfh.GetLastCommittedURL();
if (!network::IsUrlPotentiallyTrustworthy(last_committed_url)) {
return false;
}
if (!last_committed_url.SchemeIsCryptographic()) {
return false;
}
if (!IsPaymentPermissionsPolicyEnabled(rfh)) {
return false;
}
if (!IsSslValid(*content::WebContents::FromRenderFrameHost(&rfh))) {
return false;
}
return true;
}
bool SecurityChecker::IsSslValid(content::WebContents& web_contents) {
security_state::SecurityLevel security_level = GetSecurityLevel(web_contents);
// Indicate a HTTPS scheme with valid cert.
if (security_level == security_state::SECURE) {
return true;
}
return base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kIgnoreCertificateErrors);
}
security_state::SecurityLevel SecurityChecker::GetSecurityLevel(
content::WebContents& web_contents) {
std::unique_ptr<security_state::VisibleSecurityState> state =
security_state::GetVisibleSecurityState(&web_contents);
CHECK(state) << "security_state::VisibleSecurityState was a nullpt.";
return security_state::GetSecurityLevel(*state);
}
bool SecurityChecker::IsPaymentPermissionsPolicyEnabled(
content::RenderFrameHost& rfh) {
// The payment PermissionsPolicy is enabled by default on the top-level
// context, unless explicitly disabled by websites.
return rfh.IsFeatureEnabled(
network::mojom::PermissionsPolicyFeature::kPayment);
}
} // namespace payments::facilitated