Commit dea916d2 authored by David Van Cleve's avatar David Van Cleve Committed by Commit Bot

Mojoify TrustTokenOperationStatus

Blink will want to be able to interpret TrustTokenOperationStatus values
since it will be providing them to Trust Token API clients; mojoifying
the status enum makes this easier, and also allows sending the status
values for Trust Tokens operations executed via Mojo (like
"hasTrustToken," which is currently being implemented).

R=asanka

Bug: 1042962
Change-Id: I2b04de491b212208bd76f501f5b9e8225f9439b7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2102633Reviewed-by: default avatarMatthew Denton <mpdenton@chromium.org>
Reviewed-by: default avatarAsanka Herath <asanka@chromium.org>
Commit-Queue: David Van Cleve <davidvc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#751315}
parent 8be7f833
......@@ -6,6 +6,42 @@ module network.mojom;
import "url/mojom/origin.mojom";
// TrustTokenOperationStatus enumerates (an incomplete collection of) outcomes
// for a Trust Tokens protocol operation.
//
// Each status may be returned in similar cases beyond those listed in its
// comment.
enum TrustTokenOperationStatus {
kOk,
// A client-provided argument was malformed or otherwise invalid.
kInvalidArgument,
// A precondition failed (for instance, no verification key was available for
// an issuer when executing an operation required such a key to be present).
kFailedPrecondition,
// No inputs for the given operation available, or a quota on the operation's
// output would be exceeded.
kResourceExhausted,
// The operation's result already exists (for instance, a cache was hit).
kAlreadyExists,
// Internal storage has not yet initialized, or the system is unavailable in
// some other general, probably transient, manner.
kUnavailable,
// The server response was malformed or otherwise invalid.
kBadResponse,
// A, usually severe, internal error occurred.
kInternalError,
// The operation failed for some other reason.
kUnknownError,
};
// Trust Tokens operation parameterization
//
// This file specifies Mojo objects related to Trust Tokens protocol operations
......
......@@ -26,7 +26,6 @@ source_set("trust_tokens") {
"trust_token_key_commitment_parser.h",
"trust_token_key_commitment_result.cc",
"trust_token_key_commitment_result.h",
"trust_token_operation_status.h",
"trust_token_parameterization.h",
"trust_token_persister.h",
"trust_token_request_canonicalizer.cc",
......@@ -69,6 +68,7 @@ source_set("test_support") {
"//net",
"//net:test_support",
"//net/traffic_annotation:test_support",
"//services/network/public/mojom",
"//testing/gtest",
"//url",
]
......
// Copyright 2020 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.
#ifndef SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_OPERATION_STATUS_H_
#define SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_OPERATION_STATUS_H_
namespace network {
// TrustTokenOperationStatus enumerates (an incomplete collection of) outcomes
// for the Trust Tokens (http://github.com/WICG/trust-token-api) protocol
// operation: token issuance, token redemption, and request signing.
//
// Each status may be returned in similar cases beyond those listed in its
// comment.
enum class TrustTokenOperationStatus {
kOk,
// A client-provided argument was malformed or otherwise invalid.
kInvalidArgument,
// A precondition failed (for instance, a rate limit would be exceeded, a key
// commitment check failed, or executing the operation would cause too many
// issuers to be associated with the operation's top-level origin).
kFailedPrecondition,
// No inputs for the given operation available, or a quota on the operation's
// output would be exceeded.
kResourceExhausted,
// The operation's result already exists (for instance, a cache was hit).
kAlreadyExists,
// Internal storage, or some other necessary resource, has not yet
// initialized or has become unavailable.
kUnavailable,
// The server response was malformed or otherwise invalid.
kBadResponse,
// A, usually severe, internal error occurred.
kInternalError,
// The operation failed for some other reason.
kUnknownError,
// Sentinel used for serialization in IPC_ENUM_TRAITS and/or logging; do not
// use directly.
kMaxValue = kUnknownError,
};
} // namespace network
#endif // SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_OPERATION_STATUS_H_
......@@ -6,8 +6,8 @@
#define SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_REQUEST_HELPER_H_
#include "base/callback_forward.h"
#include "services/network/public/mojom/trust_tokens.mojom-shared.h"
#include "services/network/public/mojom/url_response_head.mojom-forward.h"
#include "services/network/trust_tokens/trust_token_operation_status.h"
namespace net {
class URLRequest;
......@@ -33,12 +33,12 @@ class TrustTokenRequestHelper {
// Tokens issuance and redemption, this involves executing a network request).
virtual void Begin(
net::URLRequest* request,
base::OnceCallback<void(TrustTokenOperationStatus)> done) = 0;
base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done) = 0;
// Checks |response| for issuance response headers; if these are present and
// valid, removes the headers, updates internal protocol state, and returns
// true. Otherwise, returns false.
virtual TrustTokenOperationStatus Finalize(
virtual mojom::TrustTokenOperationStatus Finalize(
mojom::URLResponseHead* response) = 0;
};
......
......@@ -202,7 +202,7 @@ Params& Params::operator=(const Params&) = default;
void TrustTokenRequestSigningHelper::Begin(
net::URLRequest* request,
base::OnceCallback<void(TrustTokenOperationStatus)> done) {
base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done) {
DCHECK(request);
DCHECK(request->url().SchemeIsHTTPOrHTTPS() &&
IsUrlPotentiallyTrustworthy(request->url()));
......@@ -226,7 +226,7 @@ void TrustTokenRequestSigningHelper::Begin(
if (!maybe_redemption_record) {
AttachSignedRedemptionRecordHeader(request, std::string());
std::move(done).Run(TrustTokenOperationStatus::kResourceExhausted);
std::move(done).Run(mojom::TrustTokenOperationStatus::kResourceExhausted);
return;
}
......@@ -236,7 +236,7 @@ void TrustTokenRequestSigningHelper::Begin(
if (!maybe_headers_to_sign) {
AttachSignedRedemptionRecordHeader(request, std::string());
std::move(done).Run(TrustTokenOperationStatus::kInvalidArgument);
std::move(done).Run(mojom::TrustTokenOperationStatus::kInvalidArgument);
return;
}
......@@ -251,7 +251,7 @@ void TrustTokenRequestSigningHelper::Begin(
}
if (params_.sign_request_data == mojom::TrustTokenSignRequestData::kOmit) {
std::move(done).Run(TrustTokenOperationStatus::kOk);
std::move(done).Run(mojom::TrustTokenOperationStatus::kOk);
return;
}
......@@ -263,7 +263,7 @@ void TrustTokenRequestSigningHelper::Begin(
request->RemoveRequestHeaderByName(kTrustTokensRequestHeaderSecTime);
request->RemoveRequestHeaderByName(kTrustTokensRequestHeaderSignedHeaders);
std::move(done).Run(TrustTokenOperationStatus::kInternalError);
std::move(done).Run(mojom::TrustTokenOperationStatus::kInternalError);
return;
}
......@@ -274,7 +274,7 @@ void TrustTokenRequestSigningHelper::Begin(
// Error serializing the header. Not expected.
if (!maybe_signature_header) {
std::move(done).Run(TrustTokenOperationStatus::kInternalError);
std::move(done).Run(mojom::TrustTokenOperationStatus::kInternalError);
return;
}
......@@ -282,12 +282,12 @@ void TrustTokenRequestSigningHelper::Begin(
*maybe_signature_header,
/*overwrite=*/true);
std::move(done).Run(TrustTokenOperationStatus::kOk);
std::move(done).Run(mojom::TrustTokenOperationStatus::kOk);
}
TrustTokenOperationStatus TrustTokenRequestSigningHelper::Finalize(
mojom::TrustTokenOperationStatus TrustTokenRequestSigningHelper::Finalize(
mojom::URLResponseHead* response) {
return TrustTokenOperationStatus::kOk;
return mojom::TrustTokenOperationStatus::kOk;
}
base::Optional<std::string>
......
......@@ -15,7 +15,6 @@
#include "net/http/http_request_headers.h"
#include "services/network/public/mojom/trust_tokens.mojom-shared.h"
#include "services/network/public/mojom/url_response_head.mojom-forward.h"
#include "services/network/trust_tokens/trust_token_operation_status.h"
#include "services/network/trust_tokens/trust_token_request_helper.h"
#include "url/origin.h"
......@@ -186,12 +185,14 @@ class TrustTokenRequestSigningHelper : public TrustTokenRequestHelper {
// empty SRR header, no signature header, and no timestamp header.
// - On precondition failure, returns an error code and possibly attaches an
// empty SRR header; see PRECONDITIONS section above.
void Begin(net::URLRequest* request,
base::OnceCallback<void(TrustTokenOperationStatus)> done) override;
void Begin(
net::URLRequest* request,
base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done) override;
// Immediately returns kOk with no other effect. (Signing is an operation that
// only needs to process requests, not their corresponding responses.)
TrustTokenOperationStatus Finalize(mojom::URLResponseHead* response) override;
mojom::TrustTokenOperationStatus Finalize(
mojom::URLResponseHead* response) override;
private:
// Given (unencoded) bytestrings |public_key| and |signature|, returns the
......
......@@ -28,7 +28,6 @@
#include "net/url_request/url_request_test_util.h"
#include "services/network/public/mojom/trust_tokens.mojom-shared.h"
#include "services/network/trust_tokens/proto/public.pb.h"
#include "services/network/trust_tokens/trust_token_operation_status.h"
#include "services/network/trust_tokens/trust_token_request_canonicalizer.h"
#include "services/network/trust_tokens/trust_token_store.h"
#include "services/network/trust_tokens/trust_token_test_util.h"
......@@ -247,10 +246,10 @@ TEST_F(TrustTokenRequestSigningHelperTest, WontSignIfNoRedemptionRecord) {
my_request->set_initiator(
url::Origin::Create(GURL("https://initiator.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kResourceExhausted);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kResourceExhausted);
EXPECT_THAT(*my_request, Header("Sec-Signed-Redemption-Record", IsEmpty()));
EXPECT_THAT(*my_request, Not(Header("Sec-Signature")));
}
......@@ -283,10 +282,10 @@ TEST_F(TrustTokenRequestSigningHelperTest, MergesHeaders) {
my_request->SetExtraRequestHeaderByName(
"Signed-Headers", "Sec-Signed-Redemption-Record", /*overwrite=*/true);
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kOk);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kOk);
std::string signed_headers_header_value;
ASSERT_TRUE(my_request->extra_request_headers().GetHeader(
"Signed-Headers", &signed_headers_header_value));
......@@ -330,10 +329,10 @@ TEST_F(TrustTokenRequestSigningHelperTest,
"TrustTokenRequestSigningHelper::kSignableRequestHeaders",
/*overwrite=*/true);
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kInvalidArgument);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kInvalidArgument);
EXPECT_THAT(*my_request, Not(Header("Signed-Headers")));
}
......@@ -365,10 +364,10 @@ TEST_F(TrustTokenRequestSigningHelperTest,
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(
url::Origin::Create(GURL("https://initiator.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kInvalidArgument);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kInvalidArgument);
EXPECT_THAT(*my_request, Not(Header("Signed-Headers")));
}
......@@ -400,10 +399,10 @@ TEST_F(TrustTokenRequestSigningHelperTestWithMockTime, ProvidesTimeHeader) {
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kOk);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kOk);
EXPECT_THAT(
*my_request,
Header("Sec-Time", StrEq(base::TimeToISO8601(base::Time::Now()))));
......@@ -432,10 +431,10 @@ TEST_F(TrustTokenRequestSigningHelperTest,
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
ASSERT_EQ(result, TrustTokenOperationStatus::kOk);
ASSERT_EQ(result, mojom::TrustTokenOperationStatus::kOk);
EXPECT_THAT(*my_request, Header("Sec-Signed-Redemption-Record",
StrEq(base::Base64Encode(base::as_bytes(
base::make_span(my_record.body()))))));
......@@ -469,10 +468,10 @@ TEST_F(TrustTokenRequestSigningHelperTest, SignAndVerifyMinimal) {
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kOk);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kOk);
ASSERT_NO_FATAL_FAILURE(
ReconstructSigningDataAndAssertSignatureVerifies<IdentitySigner>(
......@@ -502,10 +501,10 @@ TEST_F(TrustTokenRequestSigningHelperTest, SignAndVerifyWithHeaders) {
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kOk);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kOk);
ASSERT_NO_FATAL_FAILURE(
ReconstructSigningDataAndAssertSignatureVerifies<IdentitySigner>(
my_request.get(), *raw_canonicalizer));
......@@ -537,10 +536,10 @@ TEST_F(TrustTokenRequestSigningHelperTest, SignAndVerifyTimestampHeader) {
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(
url::Origin::Create(GURL("https://initiator.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kOk);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kOk);
ASSERT_NO_FATAL_FAILURE(
ReconstructSigningDataAndAssertSignatureVerifies<IdentitySigner>(
my_request.get(), *raw_canonicalizer));
......@@ -580,13 +579,13 @@ TEST_F(TrustTokenRequestSigningHelperTest,
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(
url::Origin::Create(GURL("https://initiator.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
// In addition to testing that the signing data equals
// ReconstructSigningDataAndAssertSignatureVerifies's reconstruction of the
// data, explicitly check that it contains a "url" field with the right value.
EXPECT_EQ(result, TrustTokenOperationStatus::kOk);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kOk);
ASSERT_NO_FATAL_FAILURE(
ReconstructSigningDataAndAssertSignatureVerifies<IdentitySigner>(
......@@ -631,10 +630,10 @@ TEST_F(TrustTokenRequestSigningHelperTest, CatchesSignatureFailure) {
auto my_request = MakeURLRequest("https://destination.com/");
my_request->set_initiator(
url::Origin::Create(GURL("https://initiator.com/")));
TrustTokenOperationStatus result =
mojom::TrustTokenOperationStatus result =
ExecuteBeginOperationAndWaitForResult(&helper, my_request.get());
EXPECT_EQ(result, TrustTokenOperationStatus::kInternalError);
EXPECT_EQ(result, mojom::TrustTokenOperationStatus::kInternalError);
EXPECT_THAT(*my_request, Not(Header("Signed-Headers")));
EXPECT_THAT(*my_request, Not(Header("Sec-Time")));
EXPECT_THAT(*my_request, Not(Header("Sec-Signature")));
......
......@@ -19,17 +19,18 @@ std::unique_ptr<net::URLRequest> TrustTokenRequestHelperTest::MakeURLRequest(
&delegate_, TRAFFIC_ANNOTATION_FOR_TESTS);
}
TrustTokenOperationStatus
mojom::TrustTokenOperationStatus
TrustTokenRequestHelperTest::ExecuteBeginOperationAndWaitForResult(
TrustTokenRequestHelper* helper,
net::URLRequest* request) {
base::RunLoop run_loop;
TrustTokenOperationStatus status;
helper->Begin(request, base::BindLambdaForTesting(
[&](TrustTokenOperationStatus returned_status) {
status = returned_status;
run_loop.Quit();
}));
mojom::TrustTokenOperationStatus status;
helper->Begin(request,
base::BindLambdaForTesting(
[&](mojom::TrustTokenOperationStatus returned_status) {
status = returned_status;
run_loop.Quit();
}));
run_loop.Run();
return status;
}
......
......@@ -12,7 +12,7 @@
#include "base/test/task_environment.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "net/url_request/url_request_test_util.h"
#include "services/network/trust_tokens/trust_token_operation_status.h"
#include "services/network/public/mojom/trust_tokens.mojom-shared.h"
#include "services/network/trust_tokens/trust_token_request_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -43,7 +43,7 @@ class TrustTokenRequestHelperTest : public ::testing::Test {
// Executes a request helper's Begin operation synchronously, removing some
// boilerplate from waiting for the results of the (actually asynchronous)
// operation's result.
TrustTokenOperationStatus ExecuteBeginOperationAndWaitForResult(
mojom::TrustTokenOperationStatus ExecuteBeginOperationAndWaitForResult(
TrustTokenRequestHelper* helper,
net::URLRequest* request);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment