summaryrefslogtreecommitdiffstats
path: root/components/copresence
diff options
context:
space:
mode:
authorckehoe@chromium.org <ckehoe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-14 10:20:07 +0000
committerckehoe@chromium.org <ckehoe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-14 10:20:07 +0000
commit8f22a8d1d66e042440fe086bbfa3a385f3f8e7f3 (patch)
tree78eee4247a83e7817b0abb3d03f74c7355a2ceef /components/copresence
parent01035e26fb970c5d7bebf698f6d54f4b7e256020 (diff)
downloadchromium_src-8f22a8d1d66e042440fe086bbfa3a385f3f8e7f3.zip
chromium_src-8f22a8d1d66e042440fe086bbfa3a385f3f8e7f3.tar.gz
chromium_src-8f22a8d1d66e042440fe086bbfa3a385f3f8e7f3.tar.bz2
Using API key specified from js
BUG=400617 Review URL: https://codereview.chromium.org/469883002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289511 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/copresence')
-rw-r--r--components/copresence/DEPS1
-rw-r--r--components/copresence/proto/data.proto6
-rw-r--r--components/copresence/proto/enums.proto7
-rw-r--r--components/copresence/proto/rpcs.proto1
-rw-r--r--components/copresence/public/copresence_client_delegate.h2
-rw-r--r--components/copresence/rpc/http_post.cc31
-rw-r--r--components/copresence/rpc/http_post.h20
-rw-r--r--components/copresence/rpc/http_post_unittest.cc52
-rw-r--r--components/copresence/rpc/rpc_handler.cc24
-rw-r--r--components/copresence/rpc/rpc_handler_unittest.cc18
10 files changed, 109 insertions, 53 deletions
diff --git a/components/copresence/DEPS b/components/copresence/DEPS
index 740f9d5..dec5262 100644
--- a/components/copresence/DEPS
+++ b/components/copresence/DEPS
@@ -5,4 +5,5 @@ include_rules = [
"+google_apis",
"+media",
"+net",
+ "+url",
]
diff --git a/components/copresence/proto/data.proto b/components/copresence/proto/data.proto
index 300406b..4f42c7b 100644
--- a/components/copresence/proto/data.proto
+++ b/components/copresence/proto/data.proto
@@ -29,6 +29,12 @@ message Token {
optional TokenStatus status = 3;
optional Debug debug = 4;
}
+message DeviceFingerprint {
+ optional string manufacturer = 1;
+ optional string model = 2;
+ optional PlatformType type = 3;
+ optional string platform_version = 4;
+}
message TokenTechnology {
optional TokenMedium medium = 1;
repeated TokenInstructionType instruction_type = 2;
diff --git a/components/copresence/proto/enums.proto b/components/copresence/proto/enums.proto
index 10e8014..9ff07cc 100644
--- a/components/copresence/proto/enums.proto
+++ b/components/copresence/proto/enums.proto
@@ -52,6 +52,13 @@ enum TokenInstructionType {
TRANSMIT = 1;
RECEIVE = 2;
}
+enum PlatformType {
+ UNKNOWN_PLATFORM_TYPE = 0;
+ CHROMECAST_PLATFORM_TYPE = 5;
+ ANDROID_PLATFORM_TYPE = 6;
+ IOS_PLATFORM_TYPE = 7;
+ CHROME_PLATFORM_TYPE = 8;
+}
enum InstructionType {
UNKNOWN_INSTRUCTION_TYPE = 0;
TOKEN = 1;
diff --git a/components/copresence/proto/rpcs.proto b/components/copresence/proto/rpcs.proto
index 22b868f..c138f9a8 100644
--- a/components/copresence/proto/rpcs.proto
+++ b/components/copresence/proto/rpcs.proto
@@ -10,6 +10,7 @@ message RequestHeader {
optional int64 current_time_millis = 6;
optional string registered_device_id = 7;
repeated string experiment_override = 8;
+ optional DeviceFingerprint device_fingerprint = 10;
optional string configuration_etag = 11;
}
message ResponseHeader {
diff --git a/components/copresence/public/copresence_client_delegate.h b/components/copresence/public/copresence_client_delegate.h
index 7698aec..ef7634c 100644
--- a/components/copresence/public/copresence_client_delegate.h
+++ b/components/copresence/public/copresence_client_delegate.h
@@ -38,6 +38,8 @@ class CopresenceClientDelegate {
virtual const std::string GetPlatformVersionString() const = 0;
+ virtual const std::string GetAPIKey() const = 0;
+
virtual WhispernetClient* GetWhispernetClient() = 0;
};
diff --git a/components/copresence/rpc/http_post.cc b/components/copresence/rpc/http_post.cc
index da6baae..0e2b40f 100644
--- a/components/copresence/rpc/http_post.cc
+++ b/components/copresence/rpc/http_post.cc
@@ -14,42 +14,39 @@
#include "net/http/http_status_code.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_context_getter.h"
+#include "url/gurl.h"
namespace copresence {
-// TODO(ckehoe): Come up with a better fix for Chromium.
-#ifdef GOOGLE_CHROME_BUILD
-namespace {
-
-const char kApiKeyField[] = "key";
-
-} // namespace
-#endif
-
+const char HttpPost::kApiKeyField[] = "key";
const char HttpPost::kTracingTokenField[] = "trace";
HttpPost::HttpPost(net::URLRequestContextGetter* url_context_getter,
const std::string& server_host,
const std::string& rpc_name,
const std::string& tracing_token,
+ std::string api_key,
const google::protobuf::MessageLite& request_proto) {
// Create the base URL to call.
GURL url(server_host + "/" + rpc_name);
- // Add the Chrome API key.
- // TODO(ckehoe): Replace this with an app-specific key once the
- // server API supports it. Also fix the Chromium case.
-#ifdef GOOGLE_CHROME_BUILD
- DCHECK(google_apis::HasKeysConfigured());
- url = net::AppendQueryParameter(url, kApiKeyField, google_apis::GetAPIKey());
-#endif
-
// Add the tracing token, if specified.
if (!tracing_token.empty()) {
url = net::AppendQueryParameter(
url, kTracingTokenField, "token:" + tracing_token);
}
+ // If no API key is specified, use the Chrome API key.
+ if (api_key.empty()) {
+#ifdef GOOGLE_CHROME_BUILD
+ DCHECK(google_apis::HasKeysConfigured());
+ api_key = google_apis::GetAPIKey();
+#else
+ LOG(ERROR) << "No Copresence API key provided";
+#endif
+ }
+ url = net::AppendQueryParameter(url, kApiKeyField, api_key);
+
// Serialize the proto for transmission.
std::string request_data;
bool serialize_success = request_proto.SerializeToString(&request_data);
diff --git a/components/copresence/rpc/http_post.h b/components/copresence/rpc/http_post.h
index c4c6e7f4..53a3d1c 100644
--- a/components/copresence/rpc/http_post.h
+++ b/components/copresence/rpc/http_post.h
@@ -36,19 +36,14 @@ class HttpPost : public net::URLFetcherDelegate {
typedef base::Callback<void(int, const std::string&)>
ResponseCallback;
- // An id for testing url fetching.
- static const int kUrlFetcherId = 1;
-
- // The query parameter to send Apiary tracing tokens.
- static const char kTracingTokenField[];
-
- // Create a request to the Copresence server. |url_context_getter|
- // is owned by the caller, and the context it provides must be available
- // until the request completes.
+ // Create a request to the Copresence server.
+ // |url_context_getter| is owned by the caller,
+ // and the context it provides must be available until the request completes.
HttpPost(net::URLRequestContextGetter* url_context_getter,
const std::string& server_host,
const std::string& rpc_name,
const std::string& tracing_token,
+ std::string api_key, // If blank, we overwrite with a default.
const google::protobuf::MessageLite& request_proto);
// HTTP requests are cancelled on delete.
@@ -58,10 +53,17 @@ class HttpPost : public net::URLFetcherDelegate {
void Start(const ResponseCallback& response_callback);
private:
+ static const int kUrlFetcherId = 1;
+ static const char kApiKeyField[];
+ static const char kTracingTokenField[];
+
+ friend class HttpPostTest;
+
// Overridden from net::URLFetcherDelegate.
virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
ResponseCallback response_callback_;
+
scoped_ptr<net::URLFetcher> url_fetcher_;
DISALLOW_COPY_AND_ASSIGN(HttpPost);
diff --git a/components/copresence/rpc/http_post_unittest.cc b/components/copresence/rpc/http_post_unittest.cc
index 5fc45fd..46a85b1 100644
--- a/components/copresence/rpc/http_post_unittest.cc
+++ b/components/copresence/rpc/http_post_unittest.cc
@@ -11,12 +11,14 @@
#include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
namespace {
const char kFakeServerHost[] = "test.server.google.com";
const char kRPCName[] = "testRpc";
const char kTracingToken[] = "trace me!";
+const char kApiKey[] = "unlock ALL the APIz";
} // namespace
@@ -48,6 +50,7 @@ class HttpPostTest : public testing::Test {
std::string("http://") + kFakeServerHost,
kRPCName,
"",
+ kApiKey,
proto_);
pending_post_->Start(base::Bind(&HttpPostTest::TestResponseCallback,
base::Unretained(this)));
@@ -61,6 +64,26 @@ class HttpPostTest : public testing::Test {
received_response_ == response;
}
+ net::TestURLFetcher* GetFetcher() {
+ return fetcher_factory_.GetFetcherByID(HttpPost::kUrlFetcherId);
+ }
+
+ const std::string GetApiKeySent() {
+ std::string api_key_sent;
+ net::GetValueForKeyInQuery(GetFetcher()->GetOriginalURL(),
+ HttpPost::kApiKeyField,
+ &api_key_sent);
+ return api_key_sent;
+ }
+
+ const std::string GetTracingTokenSent() {
+ std::string tracing_token_sent;
+ net::GetValueForKeyInQuery(GetFetcher()->GetOriginalURL(),
+ HttpPost::kTracingTokenField,
+ &tracing_token_sent);
+ return tracing_token_sent;
+ }
+
net::TestURLFetcherFactory fetcher_factory_;
scoped_refptr<net::TestURLRequestContextGetter> context_getter_;
@@ -79,28 +102,29 @@ TEST_F(HttpPostTest, OKResponse) {
std::string("http://") + kFakeServerHost,
kRPCName,
kTracingToken,
+ kApiKey,
proto_);
post->Start(base::Bind(&HttpPostTest::TestResponseCallback,
base::Unretained(this)));
- // Verify that the right data got sent to the right place.
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(
- HttpPost::kUrlFetcherId);
- EXPECT_EQ(kFakeServerHost, fetcher->GetOriginalURL().host());
- EXPECT_EQ(std::string("/") + kRPCName, fetcher->GetOriginalURL().path());
- std::string tracing_token_sent;
- EXPECT_TRUE(net::GetValueForKeyInQuery(fetcher->GetOriginalURL(),
- HttpPost::kTracingTokenField,
- &tracing_token_sent));
- EXPECT_EQ(std::string("token:") + kTracingToken, tracing_token_sent);
+ // Verify that the data was sent to the right place.
+ GURL requested_url = GetFetcher()->GetOriginalURL();
+ EXPECT_EQ(kFakeServerHost, requested_url.host());
+ EXPECT_EQ(std::string("/") + kRPCName, requested_url.path());
+
+ // Check query parameters.
+ EXPECT_EQ(kApiKey, GetApiKeySent());
+ EXPECT_EQ(std::string("token:") + kTracingToken, GetTracingTokenSent());
+
+ // Verify that the right data was sent.
std::string upload_data;
ASSERT_TRUE(proto_.SerializeToString(&upload_data));
- EXPECT_EQ(upload_data, fetcher->upload_data());
+ EXPECT_EQ(upload_data, GetFetcher()->upload_data());
// Send a response and check that it's passed along correctly.
- fetcher->set_response_code(net::HTTP_OK);
- fetcher->SetResponseString("Hello World!");
- fetcher->delegate()->OnURLFetchComplete(fetcher);
+ GetFetcher()->set_response_code(net::HTTP_OK);
+ GetFetcher()->SetResponseString("Hello World!");
+ GetFetcher()->delegate()->OnURLFetchComplete(GetFetcher());
EXPECT_EQ(net::HTTP_OK, received_response_code_);
EXPECT_EQ("Hello World!", received_response_);
delete post;
diff --git a/components/copresence/rpc/rpc_handler.cc b/components/copresence/rpc/rpc_handler.cc
index 283185c..d055cb0 100644
--- a/components/copresence/rpc/rpc_handler.cc
+++ b/components/copresence/rpc/rpc_handler.cc
@@ -521,8 +521,8 @@ RequestHeader* RpcHandler::CreateRequestHeader(
const std::string& client_name) const {
RequestHeader* header = new RequestHeader;
- header->set_allocated_framework_version(
- CreateVersion("Chrome", delegate_->GetPlatformVersionString()));
+ header->set_allocated_framework_version(CreateVersion(
+ "Chrome", delegate_->GetPlatformVersionString()));
if (!client_name.empty()) {
header->set_allocated_client_version(
CreateVersion(client_name, std::string()));
@@ -530,6 +530,11 @@ RequestHeader* RpcHandler::CreateRequestHeader(
header->set_current_time_millis(base::Time::Now().ToJsTime());
header->set_registered_device_id(device_id_);
+ DeviceFingerprint* fingerprint = new DeviceFingerprint;
+ fingerprint->set_platform_version(delegate_->GetPlatformVersionString());
+ fingerprint->set_type(CHROME_PLATFORM_TYPE);
+ header->set_allocated_device_fingerprint(fingerprint);
+
return header;
}
@@ -558,13 +563,14 @@ void RpcHandler::SendHttpPost(net::URLRequestContextGetter* url_context_getter,
kDefaultCopresenceServer;
// Create the request and keep a pointer until it completes.
- const std::string& tracing_token =
- command_line->GetSwitchValueASCII(switches::kCopresenceTracingToken);
- HttpPost* http_post = new HttpPost(url_context_getter,
- copresence_server_host,
- rpc_name,
- tracing_token,
- *request_proto);
+ HttpPost* http_post = new HttpPost(
+ url_context_getter,
+ copresence_server_host,
+ rpc_name,
+ command_line->GetSwitchValueASCII(switches::kCopresenceTracingToken),
+ delegate_->GetAPIKey(),
+ *request_proto);
+
http_post->Start(base::Bind(callback, http_post));
pending_posts_.insert(http_post);
}
diff --git a/components/copresence/rpc/rpc_handler_unittest.cc b/components/copresence/rpc/rpc_handler_unittest.cc
index bcdace5..7657f66 100644
--- a/components/copresence/rpc/rpc_handler_unittest.cc
+++ b/components/copresence/rpc/rpc_handler_unittest.cc
@@ -25,6 +25,8 @@ namespace copresence {
namespace {
+const char kChromeVersion[] = "Chrome Version String";
+
void AddMessageWithStrategy(ReportRequest* report,
BroadcastScanConfiguration strategy) {
report->mutable_manage_messages_request()->add_message_to_publish()
@@ -83,7 +85,7 @@ class FakeDirectiveHandler : public DirectiveHandler {
class RpcHandlerTest : public testing::Test, public CopresenceClientDelegate {
public:
- RpcHandlerTest() : rpc_handler_(this), status_(SUCCESS) {
+ RpcHandlerTest() : rpc_handler_(this), status_(SUCCESS), api_key_("API key") {
rpc_handler_.server_post_callback_ =
base::Bind(&RpcHandlerTest::CaptureHttpPost, base::Unretained(this));
rpc_handler_.device_id_ = "Device ID";
@@ -168,7 +170,11 @@ class RpcHandlerTest : public testing::Test, public CopresenceClientDelegate {
}
virtual const std::string GetPlatformVersionString() const OVERRIDE {
- return "Version String";
+ return kChromeVersion;
+ }
+
+ virtual const std::string GetAPIKey() const OVERRIDE {
+ return api_key_;
}
virtual WhispernetClient* GetWhispernetClient() OVERRIDE {
@@ -180,10 +186,11 @@ class RpcHandlerTest : public testing::Test, public CopresenceClientDelegate {
base::MessageLoop message_loop_;
RpcHandler rpc_handler_;
+ CopresenceStatus status_;
+ std::string api_key_;
std::string rpc_name_;
scoped_ptr<MessageLite> request_proto_;
- CopresenceStatus status_;
std::map<std::string, std::vector<Message> > messages_by_subscription_;
};
@@ -287,11 +294,14 @@ TEST_F(RpcHandlerTest, CreateRequestHeader) {
StatusCallback());
EXPECT_EQ(RpcHandler::kReportRequestRpcName, rpc_name_);
ReportRequest* report = static_cast<ReportRequest*>(request_proto_.get());
- EXPECT_TRUE(report->header().has_framework_version());
+ EXPECT_EQ(kChromeVersion,
+ report->header().framework_version().version_name());
EXPECT_EQ("CreateRequestHeader App ID",
report->header().client_version().client());
EXPECT_EQ("CreateRequestHeader Device ID",
report->header().registered_device_id());
+ EXPECT_EQ(CHROME_PLATFORM_TYPE,
+ report->header().device_fingerprint().type());
}
// TODO(ckehoe): Renable these after https://codereview.chromium.org/453203002/