#include "base/values.h"
#include "chrome/browser/external_protocol/auto_launch_protocols_policy_handler.h"
#include "chrome/browser/external_protocol/constants.h"
#include "chrome/browser/external_protocol/external_protocol_handler.h"
#include "chrome/browser/policy/policy_test_utils.h"
#include "chrome/browser/ui/browser.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
#include "content/public/test/browser_test.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace policy {
class ExternalProtocolPolicyBrowserTest : public PolicyTest {};
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsMalformedPolicy) {
const char kWildcardOrigin[] = "*";
const char kExampleScheme[] = "custom";
url::Origin test_origin = url::Origin::Create(GURL("https://example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kWildcardOrigin);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map.Clone()), nullptr);
UpdateProviderPolicy(policies);
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsNullInitiatingOrigin) {
const char kWildcardOrigin[] = "*";
const char kExampleScheme[] = "custom";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kWildcardOrigin);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, nullptr,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsEmptyOriginList) {
const char kExampleScheme[] = "custom";
url::Origin test_origin = url::Origin::Create(GURL("https://example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsWildcardOriginList) {
const char kWildcardOrigin[] = "*";
const char kExampleScheme[] = "custom";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kWildcardOrigin);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin = url::Origin::Create(GURL("https://example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsInvalidProtocols) {
const char kInvalidProtocol1[] = "custom:";
const char kInvalidProtocol2[] = "custom://";
const char kInvalidProtocol3[] = "custom//";
const char kWildcardOrigin[] = "*";
const char kExampleScheme[] = "custom";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map1;
base::Value::Dict protocol_origins_map2;
base::Value::Dict protocol_origins_map3;
protocol_origins_map1.Set(policy::external_protocol::kProtocolNameKey,
kInvalidProtocol1);
base::Value::List origins1;
origins1.Append(kWildcardOrigin);
protocol_origins_map1.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins1)));
protocol_origins_map_list.Append(std::move(protocol_origins_map1));
protocol_origins_map2.Set(policy::external_protocol::kProtocolNameKey,
kInvalidProtocol2);
base::Value::List origins2;
origins2.Append(kWildcardOrigin);
protocol_origins_map2.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins2)));
protocol_origins_map_list.Append(std::move(protocol_origins_map2));
protocol_origins_map3.Set(policy::external_protocol::kProtocolNameKey,
kInvalidProtocol3);
base::Value::List origins3;
origins3.Append(kWildcardOrigin);
protocol_origins_map3.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins3)));
protocol_origins_map_list.Append(std::move(protocol_origins_map3));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin = url::Origin::Create(GURL("https://example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsOriginPatternWithMissingScheme) {
const char kExampleScheme[] = "custom";
const char kHost[] = "www.example.test";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kHost);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin =
url::Origin::Create(GURL("https://www.example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
test_origin = url::Origin::Create(GURL("http://www.example.test"));
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
test_origin = url::Origin::Create(GURL("http://www.other.test"));
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsOriginPatternWithExactHostname) {
const char kExampleScheme[] = "custom";
const char kExactHostName[] = ".www.example.test";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kExactHostName);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin =
url::Origin::Create(GURL("https://www.example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
test_origin = url::Origin::Create(GURL("http://www.example.test"));
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
test_origin = url::Origin::Create(GURL("http://www.other.test"));
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsOriginPatternWithParentDomain) {
const char kExampleScheme[] = "custom";
const char kParentDomain[] = "example.test";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kParentDomain);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin =
url::Origin::Create(GURL("https://www.example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsOriginPatternWithWildcardOrigin) {
const char kExampleScheme[] = "custom";
const char kProtocolWithWildcardHostname[] = "https://*";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kProtocolWithWildcardHostname);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin =
url::Origin::Create(GURL("https://www.example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
test_origin = url::Origin::Create(GURL("http://www.example.test"));
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsOriginPatternWithFullOrigin) {
const char kExampleScheme[] = "custom";
const char kFullOrigin[] = "https://www.example.test:443";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kFullOrigin);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin =
url::Origin::Create(GURL("https://www.example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
test_origin = url::Origin::Create(GURL("https://www.example.test:443"));
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::DONT_BLOCK, block_state);
test_origin = url::Origin::Create(GURL("https://www.example.test:8080"));
block_state = ExternalProtocolHandler::GetBlockState(
kExampleScheme, &test_origin, browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsOriginPatternWithExactParentDomain) {
const char kExampleScheme[] = "custom";
const char kExactParentDomain[] = ".example.com";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kExactParentDomain);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin =
url::Origin::Create(GURL("https://www.example.test"));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
IN_PROC_BROWSER_TEST_F(ExternalProtocolPolicyBrowserTest,
AutoLaunchProtocolsOriginPatternWithPath) {
const char kExampleScheme[] = "custom";
const char kFullUrlWithPath[] = "https://example.test/home.html";
base::Value::List protocol_origins_map_list;
base::Value::Dict protocol_origins_map;
protocol_origins_map.Set(policy::external_protocol::kProtocolNameKey,
kExampleScheme);
base::Value::List origins;
origins.Append(kFullUrlWithPath);
protocol_origins_map.Set(policy::external_protocol::kOriginListKey,
base::Value(std::move(origins)));
protocol_origins_map_list.Append(std::move(protocol_origins_map));
PolicyMap policies;
policies.Set(key::kAutoLaunchProtocolsFromOrigins, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value(protocol_origins_map_list.Clone()), nullptr);
UpdateProviderPolicy(policies);
url::Origin test_origin = url::Origin::Create(GURL(kFullUrlWithPath));
ExternalProtocolHandler::BlockState block_state =
ExternalProtocolHandler::GetBlockState(kExampleScheme, &test_origin,
browser()->profile());
EXPECT_EQ(ExternalProtocolHandler::UNKNOWN, block_state);
}
}