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

Side by Side Diff: chrome/browser/services/gcm/push_messaging_service_impl.cc

Issue 874613002: Don't share Push API message payloads unless explicitly enabled. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 11 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/services/gcm/push_messaging_service_impl.h" 5 #include "chrome/browser/services/gcm/push_messaging_service_impl.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 13 matching lines...) Expand all
24 #include "chrome/common/chrome_switches.h" 24 #include "chrome/common/chrome_switches.h"
25 #include "chrome/common/pref_names.h" 25 #include "chrome/common/pref_names.h"
26 #include "chrome/grit/generated_resources.h" 26 #include "chrome/grit/generated_resources.h"
27 #include "components/content_settings/core/common/permission_request_id.h" 27 #include "components/content_settings/core/common/permission_request_id.h"
28 #include "components/gcm_driver/gcm_driver.h" 28 #include "components/gcm_driver/gcm_driver.h"
29 #include "components/pref_registry/pref_registry_syncable.h" 29 #include "components/pref_registry/pref_registry_syncable.h"
30 #include "content/public/browser/browser_context.h" 30 #include "content/public/browser/browser_context.h"
31 #include "content/public/browser/render_frame_host.h" 31 #include "content/public/browser/render_frame_host.h"
32 #include "content/public/browser/web_contents.h" 32 #include "content/public/browser/web_contents.h"
33 #include "content/public/common/child_process_host.h" 33 #include "content/public/common/child_process_host.h"
34 #include "content/public/common/content_switches.h"
34 #include "content/public/common/platform_notification_data.h" 35 #include "content/public/common/platform_notification_data.h"
35 #include "third_party/skia/include/core/SkBitmap.h" 36 #include "third_party/skia/include/core/SkBitmap.h"
36 #include "ui/base/l10n/l10n_util.h" 37 #include "ui/base/l10n/l10n_util.h"
37 38
38 namespace gcm { 39 namespace gcm {
39 40
40 namespace { 41 namespace {
41 const int kMaxRegistrations = 1000000; 42 const int kMaxRegistrations = 1000000;
42 43
43 blink::WebPushPermissionStatus ToPushPermission(ContentSetting setting) { 44 blink::WebPushPermissionStatus ToPushPermission(ContentSetting setting) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 142
142 void PushMessagingServiceImpl::ShutdownHandler() { 143 void PushMessagingServiceImpl::ShutdownHandler() {
143 // TODO(johnme): Do any necessary cleanup. 144 // TODO(johnme): Do any necessary cleanup.
144 } 145 }
145 146
146 void PushMessagingServiceImpl::OnMessage( 147 void PushMessagingServiceImpl::OnMessage(
147 const std::string& app_id, 148 const std::string& app_id,
148 const GCMClient::IncomingMessage& message) { 149 const GCMClient::IncomingMessage& message) {
149 // The Push API only exposes a single string of data in the push event fired 150 // The Push API only exposes a single string of data in the push event fired
150 // on the Service Worker. When developers send messages using GCM to the Push 151 // on the Service Worker. When developers send messages using GCM to the Push
151 // API, they must pass a single key-value pair, where the key is "data" and 152 // API and want to include a message payload, they must pass a single key-
152 // the value is the string they want to be passed to their Service Worker. 153 // value pair, where the key is "data" and the value is the string they want
153 // For example, they could send the following JSON using the HTTPS GCM API: 154 // to be passed to their Service Worker. For example, they could send the
155 // following JSON using the HTTPS GCM API:
154 // { 156 // {
155 // "registration_ids": ["FOO", "BAR"], 157 // "registration_ids": ["FOO", "BAR"],
156 // "data": { 158 // "data": {
157 // "data": "BAZ", 159 // "data": "BAZ",
158 // }, 160 // },
159 // "delay_while_idle": true, 161 // "delay_while_idle": true,
160 // } 162 // }
161 // TODO(johnme): Make sure this is clearly documented for developers. 163 // TODO(johnme): Make sure this is clearly documented for developers.
162 PushMessagingApplicationId application_id = 164 PushMessagingApplicationId application_id =
163 PushMessagingApplicationId::Parse(app_id); 165 PushMessagingApplicationId::Parse(app_id);
164 GCMClient::MessageData::const_iterator it = message.data.find("data");
165 if (application_id.IsValid() && it != message.data.end()) {
166 if (!HasPermission(application_id.origin)) {
167 // The |origin| lost push permission. We need to unregister and drop this
168 // message.
169 Unregister(application_id, UnregisterCallback());
170 return;
171 }
172 166
173 const std::string& data = it->second; 167 // Drop messages whose application is is invalid.
174 content::BrowserContext::DeliverPushMessage( 168 if (!application_id.IsValid()) {
175 profile_,
176 application_id.origin,
177 application_id.service_worker_registration_id,
178 data,
179 base::Bind(&PushMessagingServiceImpl::DeliverMessageCallback,
180 weak_factory_.GetWeakPtr(),
181 application_id,
182 message));
183 } else {
184 // Drop the message, as it is invalid.
185 DeliverMessageCallback(application_id, message, 169 DeliverMessageCallback(application_id, message,
186 content::PUSH_DELIVERY_STATUS_INVALID_MESSAGE); 170 content::PUSH_DELIVERY_STATUS_INVALID_MESSAGE);
171 return;
187 } 172 }
173
174 // |origin| may have lost push permission. Unregister and drop this message.
175 if (!HasPermission(application_id.origin)) {
176 Unregister(application_id, UnregisterCallback());
177 return;
178 }
179
180 std::string data;
181
182 // TODO(peter): Message payloads are disabled pending mandatory encryption.
183 // https://crbug.com/449184
184 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
185 switches::kEnablePushMessagePayload)) {
186 GCMClient::MessageData::const_iterator it = message.data.find("data");
187 if (it != message.data.end())
188 data = it->second;
189 }
190
191 content::BrowserContext::DeliverPushMessage(
192 profile_,
193 application_id.origin,
194 application_id.service_worker_registration_id,
195 data,
196 base::Bind(&PushMessagingServiceImpl::DeliverMessageCallback,
197 weak_factory_.GetWeakPtr(),
198 application_id,
199 message));
188 } 200 }
189 201
190 void PushMessagingServiceImpl::SetProfileForTesting(Profile* profile) { 202 void PushMessagingServiceImpl::SetProfileForTesting(Profile* profile) {
191 profile_ = profile; 203 profile_ = profile;
192 } 204 }
193 205
194 void PushMessagingServiceImpl::DeliverMessageCallback( 206 void PushMessagingServiceImpl::DeliverMessageCallback(
195 const PushMessagingApplicationId& application_id, 207 const PushMessagingApplicationId& application_id,
196 const GCMClient::IncomingMessage& message, 208 const GCMClient::IncomingMessage& message,
197 content::PushDeliveryStatus status) { 209 content::PushDeliveryStatus status) {
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 bool PushMessagingServiceImpl::HasPermission(const GURL& origin) { 504 bool PushMessagingServiceImpl::HasPermission(const GURL& origin) {
493 gcm::PushMessagingPermissionContext* permission_context = 505 gcm::PushMessagingPermissionContext* permission_context =
494 gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_); 506 gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_);
495 DCHECK(permission_context); 507 DCHECK(permission_context);
496 508
497 return permission_context->GetPermissionStatus(origin, origin) == 509 return permission_context->GetPermissionStatus(origin, origin) ==
498 CONTENT_SETTING_ALLOW; 510 CONTENT_SETTING_ALLOW;
499 } 511 }
500 512
501 } // namespace gcm 513 } // namespace gcm
OLDNEW
« no previous file with comments | « chrome/browser/services/gcm/push_messaging_browsertest.cc ('k') | content/child/runtime_features.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698