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; |
} |