blob: 753e4349abf57cf8b02d7a73e6d4bcfe11517201 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/network/initiator_lock_compatibility.h"
#include "base/optional.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/origin.h"
namespace network {
InitiatorLockCompatibility VerifyRequestInitiatorSiteLock(
int process_id,
base::Optional<url::Origin> lock,
base::Optional<url::Origin> initiator) {
auto factory_params = mojom::URLLoaderFactoryParams::New();
factory_params->process_id = process_id;
factory_params->request_initiator_site_lock = lock;
ResourceRequest request;
request.request_initiator = initiator;
return VerifyRequestInitiatorLock(*factory_params, request);
}
TEST(InitiatorLockCompatibilityTest, VerifyRequestInitiatorSiteLock) {
url::Origin opaque_origin = url::Origin();
url::Origin opaque_origin2 = url::Origin();
url::Origin ip_origin1 = url::Origin::Create(GURL("http://127.0.0.1/"));
url::Origin ip_origin2 = url::Origin::Create(GURL("http://217.17.45.162/"));
url::Origin example_com = url::Origin::Create(GURL("http://example.com"));
url::Origin foo_example_com =
url::Origin::Create(GURL("http://foo.example.com"));
url::Origin bar_example_com =
url::Origin::Create(GURL("http://bar.example.com"));
url::Origin foo_example_com_dot =
url::Origin::Create(GURL("http://foo.example.com."));
url::Origin bar_foo_example_com =
url::Origin::Create(GURL("http://bar.foo.example.com"));
url::Origin other_site = url::Origin::Create(GURL("http://other.com"));
constexpr int kRendererProcessId = 123;
// Cases without a lock.
EXPECT_EQ(InitiatorLockCompatibility::kBrowserProcess,
VerifyRequestInitiatorSiteLock(mojom::kBrowserProcessId,
base::nullopt, base::nullopt));
EXPECT_EQ(InitiatorLockCompatibility::kNoLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, base::nullopt,
base::nullopt));
// Opaque initiator is always safe (and so results in kCompatibleLock).
// OTOH, opaque lock is only compatible with an opaque initiator.
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId,
bar_foo_example_com, opaque_origin));
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, opaque_origin,
opaque_origin2));
EXPECT_EQ(InitiatorLockCompatibility::kIncorrectLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, opaque_origin,
bar_foo_example_com));
// Regular origin equality.
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(
kRendererProcessId, bar_foo_example_com, bar_foo_example_com));
// Regular origin inequality.
EXPECT_EQ(InitiatorLockCompatibility::kIncorrectLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId,
bar_foo_example_com, other_site));
// IP addresses have to be special-cased in some places (e.g. they shouldn't
// be subject to DomainIs / eTLD+1 comparisons).
EXPECT_EQ(InitiatorLockCompatibility::kIncorrectLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, ip_origin1,
ip_origin2));
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, ip_origin1,
ip_origin1));
// Compatibility check shouldn't strip the lock down to eTLD+1.
EXPECT_EQ(InitiatorLockCompatibility::kIncorrectLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, foo_example_com,
bar_example_com));
// Site-URL-based comparisons.
//
// TODO(lukasza): These should result in kIncorrectLock eventually (once
// request_initiator_site_lock becomes request_initiator_origin_lock - see
// https://crbug.com/888079 and https://crbug.com/891872.
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, example_com,
bar_foo_example_com));
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, foo_example_com,
bar_foo_example_com));
// The trailing dot is not important (at least for site-URL-based
// comparisons).
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(
kRendererProcessId, foo_example_com_dot, foo_example_com));
EXPECT_EQ(InitiatorLockCompatibility::kCompatibleLock,
VerifyRequestInitiatorSiteLock(kRendererProcessId, foo_example_com,
foo_example_com_dot));
}
} // namespace network