Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1298)

Unified Diff: content/common/origin_trials/trial_token.cc

Issue 1909633003: Collect UMA data for Origin Trials (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/common/origin_trials/trial_token.cc
diff --git a/content/common/origin_trials/trial_token.cc b/content/common/origin_trials/trial_token.cc
index 0a137edc68b43e780e572c1d083379c864921fc8..65980de3575a8d02fef99f0d37fe9e0dde73b001 100644
--- a/content/common/origin_trials/trial_token.cc
+++ b/content/common/origin_trials/trial_token.cc
@@ -16,6 +16,7 @@
#include "base/strings/string_piece.h"
#include "base/time/time.h"
#include "base/values.h"
+#include "third_party/WebKit/public/platform/WebOriginTrialTokenStatus.h"
#include "url/gurl.h"
#include "url/origin.h"
@@ -44,48 +45,68 @@ const uint8_t kVersion2 = 2;
TrialToken::~TrialToken() {}
// static
-std::unique_ptr<TrialToken> TrialToken::From(const std::string& token_text,
- base::StringPiece public_key) {
- std::unique_ptr<std::string> token_payload = Extract(token_text, public_key);
- if (!token_payload) {
+std::unique_ptr<TrialToken> TrialToken::From(
+ const std::string& token_text,
+ base::StringPiece public_key,
+ blink::WebOriginTrialTokenStatus* out_status) {
+ DCHECK(out_status);
+ std::string token_payload;
+ *out_status = Extract(token_text, public_key, &token_payload);
+ if (*out_status != blink::WebOriginTrialTokenStatus::Success) {
return nullptr;
}
- return Parse(*token_payload);
+ std::unique_ptr<TrialToken> token = Parse(token_payload);
+ *out_status = token ? blink::WebOriginTrialTokenStatus::Success
+ : blink::WebOriginTrialTokenStatus::Malformed;
+ return token;
}
-bool TrialToken::IsValidForFeature(const url::Origin& origin,
- base::StringPiece feature_name,
- const base::Time& now) const {
- return ValidateOrigin(origin) && ValidateFeatureName(feature_name) &&
- ValidateDate(now);
+blink::WebOriginTrialTokenStatus TrialToken::IsValidForFeature(
+ const url::Origin& origin,
+ base::StringPiece feature_name,
+ const base::Time& now) const {
+ // The order of these checks is intentional. For example, will only report a
+ // token as expired if it is valid for the origin + feature combination.
+ if (!ValidateOrigin(origin)) {
+ return blink::WebOriginTrialTokenStatus::WrongOrigin;
+ }
+ if (!ValidateFeatureName(feature_name)) {
+ return blink::WebOriginTrialTokenStatus::WrongFeature;
+ }
+ if (!ValidateDate(now)) {
+ return blink::WebOriginTrialTokenStatus::Expired;
+ }
+ return blink::WebOriginTrialTokenStatus::Success;
}
-std::unique_ptr<std::string> TrialToken::Extract(
- const std::string& token_payload,
- base::StringPiece public_key) {
- if (token_payload.empty()) {
- return nullptr;
+// static
+blink::WebOriginTrialTokenStatus TrialToken::Extract(
+ const std::string& token_text,
+ base::StringPiece public_key,
+ std::string* out_token_payload) {
+ if (token_text.empty()) {
+ return blink::WebOriginTrialTokenStatus::Malformed;
}
// Token is base64-encoded; decode first.
std::string token_contents;
- if (!base::Base64Decode(token_payload, &token_contents)) {
- return nullptr;
+ if (!base::Base64Decode(token_text, &token_contents)) {
+ return blink::WebOriginTrialTokenStatus::Malformed;
}
// Only version 2 currently supported.
if (token_contents.length() < (kVersionOffset + kVersionSize)) {
- return nullptr;
+ return blink::WebOriginTrialTokenStatus::Malformed;
}
uint8_t version = token_contents[kVersionOffset];
if (version != kVersion2) {
- return nullptr;
+ return blink::WebOriginTrialTokenStatus::WrongVersion;
}
// Token must be large enough to contain a version, signature, and payload
// length.
if (token_contents.length() < (kPayloadLengthOffset + kPayloadLengthSize)) {
- return nullptr;
+ return blink::WebOriginTrialTokenStatus::Malformed;
}
// Extract the length of the signed data (Big-endian).
@@ -94,7 +115,7 @@ std::unique_ptr<std::string> TrialToken::Extract(
// Validate that the stated length matches the actual payload length.
if (payload_length != token_contents.length() - kPayloadOffset) {
- return nullptr;
+ return blink::WebOriginTrialTokenStatus::Malformed;
}
// Extract the version-specific contents of the token.
@@ -110,17 +131,19 @@ std::unique_ptr<std::string> TrialToken::Extract(
// Validate the signature on the data before proceeding.
if (!TrialToken::ValidateSignature(signature, signed_data, public_key)) {
- return nullptr;
+ return blink::WebOriginTrialTokenStatus::InvalidSignature;
}
// Return just the payload, as a new string.
- return base::WrapUnique(
- new std::string(token_contents, kPayloadOffset, payload_length));
+ *out_token_payload = token_contents.substr(kPayloadOffset, payload_length);
+ return blink::WebOriginTrialTokenStatus::Success;
}
-std::unique_ptr<TrialToken> TrialToken::Parse(const std::string& token_json) {
+// static
+std::unique_ptr<TrialToken> TrialToken::Parse(
+ const std::string& token_payload) {
std::unique_ptr<base::DictionaryValue> datadict =
- base::DictionaryValue::From(base::JSONReader::Read(token_json));
+ base::DictionaryValue::From(base::JSONReader::Read(token_payload));
if (!datadict) {
return nullptr;
}

Powered by Google App Engine
This is Rietveld 408576698