Chromium Code Reviews| Index: content/browser/experiments/api_key.cc |
| diff --git a/content/browser/experiments/api_key.cc b/content/browser/experiments/api_key.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..fd7ab0b49ab84db9e438b61141c22c562ce8f8f8 |
| --- /dev/null |
| +++ b/content/browser/experiments/api_key.cc |
| @@ -0,0 +1,68 @@ |
| +// Copyright 2015 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 "content/browser/experiments/api_key.h" |
| + |
| +#include <vector> |
| + |
| +#include "base/base64.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/string_util.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "base/time/time.h" |
| + |
| +namespace content { |
| + |
| +ApiKey::~ApiKey() {} |
| + |
| +scoped_ptr<ApiKey> ApiKey::Parse(const std::string& key_text) { |
| + if (key_text.empty()) { |
| + return nullptr; |
| + } |
| + |
| + // API Key should resemble: |
| + // signature|origin|api_name|expiry_timestamp |
| + std::vector<std::string> parts = |
| + SplitString(key_text, "|", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); |
|
Marijn Kruisselbrink
2015/12/18 22:03:01
I realize you only use "|" in one place (other tha
iclelland
2015/12/21 19:17:17
Done.
|
| + if (parts.size() != 4) { |
| + return nullptr; |
| + } |
| + |
| + const std::string& signature = parts[0]; |
| + const std::string& origin_string = parts[1]; |
| + const std::string& api_name = parts[2]; |
| + const std::string& expiry_string = parts[3]; |
| + |
| + uint64_t expiry_timestamp; |
| + if (!base::StringToUint64(expiry_string, &expiry_timestamp)) { |
| + return nullptr; |
| + } |
| + |
| + // signed data is (origin + "|" + api_name + "|" + expiry). |
| + const std::string& data = key_text.substr(key_text.find('|') + 1); |
| + |
| + return scoped_ptr<ApiKey>(new ApiKey(signature, data, GURL(origin_string), |
| + api_name, expiry_timestamp)); |
| +} |
| + |
| +ApiKey::ApiKey(const std::string& signature, |
| + const std::string& data, |
| + const GURL& origin, |
| + const std::string& api_name, |
| + uint64_t expiry_timestamp) |
| + : signature_(signature), |
| + data_(data), |
| + origin_(origin), |
| + api_name_(api_name), |
| + expiry_timestamp_(expiry_timestamp) {} |
| + |
| +bool ApiKey::IsValidNow(const base::Time& now) const { |
| + // TODO(iclelland): Validate signature on key data here as well. |
| + // https://crbug.com/543215 |
| + base::Time expiry_time = base::Time::FromDoubleT((double)expiry_timestamp_); |
| + return expiry_time > now; |
| +} |
| + |
| +} // namespace |