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

Side by Side Diff: components/gcm_driver/instance_id/instance_id_impl.cc

Issue 1137463003: Support getting and deleting token for Instance ID. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add new files Created 5 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/gcm_driver/instance_id/instance_id_impl.h" 5 #include "components/gcm_driver/instance_id/instance_id_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include "base/base64.h" 8 #include "base/base64.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "components/gcm_driver/gcm_driver_desktop.h" 13 #include "components/gcm_driver/gcm_driver_desktop.h"
14 #include "crypto/random.h" 14 #include "crypto/random.h"
15 15
16 namespace instance_id { 16 namespace instance_id {
17 17
18 namespace {
19
20 InstanceID::Result GCMClientResultToInstanceIDResult(
21 gcm::GCMClient::Result result) {
22 switch (result) {
fgorski 2015/05/13 18:32:39 ASYNC_OPERATION_PENDING?
jianli 2015/05/13 22:42:56 Done.
23 case gcm::GCMClient::SUCCESS:
24 return InstanceID::SUCCESS;
25 case gcm::GCMClient::INVALID_PARAMETER:
26 return InstanceID::INVALID_PARAMETER;
27 case gcm::GCMClient::GCM_DISABLED:
28 return InstanceID::DISABLED;
29 case gcm::GCMClient::NETWORK_ERROR:
30 return InstanceID::NETWORK_ERROR;
31 case gcm::GCMClient::SERVER_ERROR:
32 return InstanceID::SERVER_ERROR;
33 case gcm::GCMClient::UNKNOWN_ERROR:
34 return InstanceID::UNKNOWN_ERROR;
35 default:
36 NOTREACHED() << "Unexpected value of result cannot be converted: "
37 << result;
38 }
39 return InstanceID::UNKNOWN_ERROR;
40 }
41
42 } // namespace
43
18 // static 44 // static
19 InstanceID* InstanceID::Create(const std::string& app_id, 45 InstanceID* InstanceID::Create(const std::string& app_id,
20 gcm::GCMDriver* gcm_driver) { 46 gcm::GCMDriver* gcm_driver) {
21 return new InstanceIDImpl(app_id, gcm_driver); 47 return new InstanceIDImpl(app_id, gcm_driver);
22 } 48 }
23 49
24 InstanceIDImpl::InstanceIDImpl(const std::string& app_id, 50 InstanceIDImpl::InstanceIDImpl(const std::string& app_id,
25 gcm::GCMDriver* gcm_driver) 51 gcm::GCMDriver* gcm_driver)
26 : InstanceID(app_id), 52 : InstanceID(app_id),
27 gcm_driver_(gcm_driver), 53 gcm_driver_(gcm_driver),
28 load_from_store_(false), 54 load_from_store_(false),
29 weak_ptr_factory_(this) { 55 weak_ptr_factory_(this) {
30 gcm_driver_->GetInstanceIDStore()->GetInstanceIDData( 56 GetInstanceIDHandler()->GetInstanceIDData(
31 app_id, 57 app_id,
32 base::Bind(&InstanceIDImpl::GetInstanceIDDataCompleted, 58 base::Bind(&InstanceIDImpl::GetInstanceIDDataCompleted,
33 weak_ptr_factory_.GetWeakPtr())); 59 weak_ptr_factory_.GetWeakPtr()));
34 } 60 }
35 61
36 InstanceIDImpl::~InstanceIDImpl() { 62 InstanceIDImpl::~InstanceIDImpl() {
37 } 63 }
38 64
39 void InstanceIDImpl::GetID(const GetIDCallback& callback) { 65 void InstanceIDImpl::GetID(const GetIDCallback& callback) {
40 if (!delayed_task_controller_.CanRunTaskWithoutDelay()) { 66 if (!delayed_task_controller_.CanRunTaskWithoutDelay()) {
(...skipping 27 matching lines...) Expand all
68 void InstanceIDImpl::DoGetCreationTime( 94 void InstanceIDImpl::DoGetCreationTime(
69 const GetCreationTimeCallback& callback) { 95 const GetCreationTimeCallback& callback) {
70 callback.Run(creation_time_); 96 callback.Run(creation_time_);
71 } 97 }
72 98
73 void InstanceIDImpl::GetToken( 99 void InstanceIDImpl::GetToken(
74 const std::string& authorized_entity, 100 const std::string& authorized_entity,
75 const std::string& scope, 101 const std::string& scope,
76 const std::map<std::string, std::string>& options, 102 const std::map<std::string, std::string>& options,
77 const GetTokenCallback& callback) { 103 const GetTokenCallback& callback) {
78 NOTIMPLEMENTED(); 104 if (!delayed_task_controller_.CanRunTaskWithoutDelay()) {
105 delayed_task_controller_.AddTask(
106 base::Bind(&InstanceIDImpl::DoGetToken,
107 weak_ptr_factory_.GetWeakPtr(),
108 authorized_entity,
109 scope,
110 options,
111 callback));
112 return;
113 }
114
115 DoGetToken(authorized_entity, scope, options, callback);
116 }
117
118 void InstanceIDImpl::DoGetToken(
119 const std::string& authorized_entity,
120 const std::string& scope,
121 const std::map<std::string, std::string>& options,
122 const GetTokenCallback& callback) {
123 EnsureIDGenerated();
124
125 GetInstanceIDHandler()->GetToken(
126 app_id(),
127 authorized_entity,
128 scope,
129 options,
130 base::Bind(&InstanceIDImpl::OnGetTokenCompleted,
131 weak_ptr_factory_.GetWeakPtr(),
132 callback));
79 } 133 }
80 134
81 void InstanceIDImpl::DeleteToken(const std::string& authorized_entity, 135 void InstanceIDImpl::DeleteToken(const std::string& authorized_entity,
82 const std::string& scope, 136 const std::string& scope,
83 const DeleteTokenCallback& callback) { 137 const DeleteTokenCallback& callback) {
84 NOTIMPLEMENTED(); 138 if (!delayed_task_controller_.CanRunTaskWithoutDelay()) {
139 delayed_task_controller_.AddTask(
140 base::Bind(&InstanceIDImpl::DoDeleteToken,
141 weak_ptr_factory_.GetWeakPtr(),
142 authorized_entity,
143 scope,
144 callback));
145 return;
146 }
147
148 DoDeleteToken(authorized_entity, scope, callback);
149 }
150
151 void InstanceIDImpl::DoDeleteToken(
152 const std::string& authorized_entity,
153 const std::string& scope,
154 const DeleteTokenCallback& callback) {
155 // Nothing to delete if the ID has not been generated.
156 if (id_.empty())
157 callback.Run(InstanceID::SUCCESS);
158
159 GetInstanceIDHandler()->DeleteToken(
160 app_id(),
161 authorized_entity,
162 scope,
163 base::Bind(&InstanceIDImpl::OnDeleteTokenCompleted,
164 weak_ptr_factory_.GetWeakPtr(),
165 callback));
85 } 166 }
86 167
87 void InstanceIDImpl::DeleteID(const DeleteIDCallback& callback) { 168 void InstanceIDImpl::DeleteID(const DeleteIDCallback& callback) {
88 gcm_driver_->GetInstanceIDStore()->RemoveInstanceIDData(app_id()); 169 GetInstanceIDHandler()->RemoveInstanceIDData(app_id());
89 170
90 id_.clear(); 171 id_.clear();
91 creation_time_ = base::Time(); 172 creation_time_ = base::Time();
92 173
93 base::MessageLoop::current()->PostTask( 174 base::MessageLoop::current()->PostTask(
94 FROM_HERE, 175 FROM_HERE,
95 base::Bind(callback, InstanceID::SUCCESS)); 176 base::Bind(callback, InstanceID::SUCCESS));
96 } 177 }
97 178
179 void InstanceIDImpl::OnGetTokenCompleted(const GetTokenCallback& callback,
180 const std::string& token,
181 gcm::GCMClient::Result result) {
182 callback.Run(token, GCMClientResultToInstanceIDResult(result));
183 }
184
185 void InstanceIDImpl::OnDeleteTokenCompleted(
186 const DeleteTokenCallback& callback,
187 gcm::GCMClient::Result result) {
188 callback.Run(GCMClientResultToInstanceIDResult(result));
189 }
190
98 void InstanceIDImpl::GetInstanceIDDataCompleted( 191 void InstanceIDImpl::GetInstanceIDDataCompleted(
99 const std::string& instance_id_data) { 192 const std::string& instance_id_data) {
100 Deserialize(instance_id_data); 193 Deserialize(instance_id_data);
101 delayed_task_controller_.SetReady(); 194 delayed_task_controller_.SetReady();
102 } 195 }
103 196
197 gcm::InstanceIDHandler* InstanceIDImpl::GetInstanceIDHandler() const {
198 gcm::InstanceIDHandler* handler = gcm_driver_->GetInstanceIDHandler();
199 DCHECK(handler);
200 return handler;
201 }
202
104 void InstanceIDImpl::EnsureIDGenerated() { 203 void InstanceIDImpl::EnsureIDGenerated() {
105 if (!id_.empty()) 204 if (!id_.empty())
106 return; 205 return;
107 206
108 // Now produce the ID in the following steps: 207 // Now produce the ID in the following steps:
109 208
110 // 1) Generates the random number in 8 bytes which is required by the server. 209 // 1) Generates the random number in 8 bytes which is required by the server.
111 // We don't want to be strictly cryptographically secure. The server might 210 // We don't want to be strictly cryptographically secure. The server might
112 // reject the ID if there is a conflict or problem. 211 // reject the ID if there is a conflict or problem.
113 uint8 bytes[kInstanceIDByteLength]; 212 uint8 bytes[kInstanceIDByteLength];
(...skipping 10 matching lines...) Expand all
124 base::Base64Encode( 223 base::Base64Encode(
125 base::StringPiece(reinterpret_cast<const char*>(bytes), sizeof(bytes)), 224 base::StringPiece(reinterpret_cast<const char*>(bytes), sizeof(bytes)),
126 &id_); 225 &id_);
127 std::replace(id_.begin(), id_.end(), '+', '-'); 226 std::replace(id_.begin(), id_.end(), '+', '-');
128 std::replace(id_.begin(), id_.end(), '/', '_'); 227 std::replace(id_.begin(), id_.end(), '/', '_');
129 id_.erase(std::remove(id_.begin(), id_.end(), '='), id_.end()); 228 id_.erase(std::remove(id_.begin(), id_.end(), '='), id_.end());
130 229
131 creation_time_ = base::Time::Now(); 230 creation_time_ = base::Time::Now();
132 231
133 // Save to the persistent store. 232 // Save to the persistent store.
134 gcm_driver_->GetInstanceIDStore()->AddInstanceIDData( 233 GetInstanceIDHandler()->AddInstanceIDData(
135 app_id(), SerializeAsString()); 234 app_id(), SerializeAsString());
136 } 235 }
137 236
138 std::string InstanceIDImpl::SerializeAsString() const { 237 std::string InstanceIDImpl::SerializeAsString() const {
139 std::string serialized_data; 238 std::string serialized_data;
140 serialized_data += id_; 239 serialized_data += id_;
141 serialized_data += ","; 240 serialized_data += ",";
142 serialized_data += base::Int64ToString(creation_time_.ToInternalValue()); 241 serialized_data += base::Int64ToString(creation_time_.ToInternalValue());
143 return serialized_data; 242 return serialized_data;
144 } 243 }
(...skipping 11 matching lines...) Expand all
156 255
157 int64 time_internal = 0LL; 256 int64 time_internal = 0LL;
158 if (!base::StringToInt64(serialized_data.substr(pos + 1), &time_internal)) { 257 if (!base::StringToInt64(serialized_data.substr(pos + 1), &time_internal)) {
159 DVLOG(1) << "Failed to deserialize the InstanceID data: " + serialized_data; 258 DVLOG(1) << "Failed to deserialize the InstanceID data: " + serialized_data;
160 return; 259 return;
161 } 260 }
162 creation_time_ = base::Time::FromInternalValue(time_internal); 261 creation_time_ = base::Time::FromInternalValue(time_internal);
163 } 262 }
164 263
165 } // namespace instance_id 264 } // namespace instance_id
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698