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

Unified Diff: content/browser/push_messaging/push_messaging_message_filter.cc

Issue 1210283005: Introduce the PushSubscription.curve25519dh attribute (2/3) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/push_messaging/push_messaging_message_filter.cc
diff --git a/content/browser/push_messaging/push_messaging_message_filter.cc b/content/browser/push_messaging/push_messaging_message_filter.cc
index 7d550ac7b2f56dc51cd8fb52b3608beb1fdbbe17..87321de77294b2e2f3548f6e834e0561454b6290 100644
--- a/content/browser/push_messaging/push_messaging_message_filter.cc
+++ b/content/browser/push_messaging/push_messaging_message_filter.cc
@@ -64,6 +64,17 @@ void RecordGetRegistrationStatus(PushGetRegistrationStatus status) {
PUSH_GETREGISTRATION_STATUS_LAST + 1);
}
+// Curries the |success| and |curve25519dh| parameters over to |callback| and
+// posts a task to invoke |callback| on the IO thread.
+void ForwardPublicEncryptionKeysToIOThreadProxy(
johnme 2015/07/09 16:02:53 It's a bit unusual that Core::GetPublicEncryptionK
Peter Beverloo 2015/07/09 18:54:17 All the Record*Status have DCHECKS to be on the IO
+ const PushMessagingService::PublicKeyCallback& callback,
+ bool success,
+ const std::vector<uint8_t>& curve25519dh) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(callback, success, curve25519dh));
+}
+
// Concatenates the subscription id with the endpoint base to create a new
// GURL object containing the endpoint unique to the subscription.
GURL CreatePushEndpoint(const GURL& push_endpoint_base,
@@ -97,6 +108,12 @@ class PushMessagingMessageFilter::Core {
// Called via PostTask from IO thread.
void RegisterOnUI(const RegisterData& data, const std::string& sender_id);
+ // Called via PostTask from IO thread.
+ void GetPublicEncryptionKeyOnUI(
johnme 2015/07/09 16:02:53 Please move this to the "Public helper methods on
Peter Beverloo 2015/07/09 18:54:17 Done.
+ const GURL& origin,
+ int64_t service_worker_registration_id,
+ const PushMessagingService::PublicKeyCallback& callback);
+
// Public Unregister methods on UI thread ------------------------------------
// Called via PostTask from IO thread.
@@ -130,6 +147,7 @@ class PushMessagingMessageFilter::Core {
void DidRegister(const RegisterData& data,
const std::string& push_registration_id,
+ const std::vector<uint8_t>& curve25519dh,
PushRegistrationStatus status);
// Private Unregister methods on UI thread -----------------------------------
@@ -312,8 +330,16 @@ void PushMessagingMessageFilter::DidCheckForExistingRegistration(
ServiceWorkerStatusCode service_worker_status) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (service_worker_status == SERVICE_WORKER_OK) {
- SendRegisterSuccess(data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE,
- push_registration_id);
+ auto callback =
+ base::Bind(&PushMessagingMessageFilter::DidGetEncryptionKeys,
+ weak_factory_io_to_io_.GetWeakPtr(), data,
+ push_registration_id);
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&Core::GetPublicEncryptionKeyOnUI,
+ base::Unretained(ui_core_.get()), data.requesting_origin,
+ data.service_worker_registration_id, callback));
return;
}
// TODO(johnme): The spec allows the register algorithm to reject with an
@@ -335,6 +361,39 @@ void PushMessagingMessageFilter::DidCheckForExistingRegistration(
}
}
+void PushMessagingMessageFilter::Core::GetPublicEncryptionKeyOnUI(
johnme 2015/07/09 16:02:53 Similarly, please move this to the "Helper methods
Peter Beverloo 2015/07/09 18:54:17 Done.
+ const GURL& origin,
+ int64_t service_worker_registration_id,
+ const PushMessagingService::PublicKeyCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ PushMessagingService* push_service = service();
+ if (push_service) {
+ push_service->GetPublicEncryptionKey(
+ origin, service_worker_registration_id,
+ base::Bind(&ForwardPublicEncryptionKeysToIOThreadProxy, callback));
+ return;
+ }
+
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(callback, false /* success */, std::vector<uint8_t>()));
+}
+
+void PushMessagingMessageFilter::DidGetEncryptionKeys(
+ const RegisterData& data,
+ const std::string& push_registration_id,
+ bool success,
+ const std::vector<uint8_t>& curve25519dh) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (!success) {
+ SendRegisterError(data, PUSH_REGISTRATION_STATUS_PUBLIC_KEY_UNAVAILABLE);
+ return;
+ }
+
+ SendRegisterSuccess(data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE,
+ push_registration_id, curve25519dh);
+}
+
void PushMessagingMessageFilter::DidGetSenderIdFromStorage(
const RegisterData& data,
const std::string& sender_id,
@@ -409,13 +468,14 @@ void PushMessagingMessageFilter::Core::RegisterOnUI(
void PushMessagingMessageFilter::Core::DidRegister(
const RegisterData& data,
const std::string& push_registration_id,
+ const std::vector<uint8_t>& curve25519dh,
PushRegistrationStatus status) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (status == PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE) {
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&PushMessagingMessageFilter::PersistRegistrationOnIO,
- io_parent_, data, push_registration_id));
+ io_parent_, data, push_registration_id, curve25519dh));
} else {
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
@@ -426,7 +486,8 @@ void PushMessagingMessageFilter::Core::DidRegister(
void PushMessagingMessageFilter::PersistRegistrationOnIO(
const RegisterData& data,
- const std::string& push_registration_id) {
+ const std::string& push_registration_id,
+ const std::vector<uint8_t>& curve25519dh) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
service_worker_context_->StoreRegistrationUserData(
data.service_worker_registration_id,
@@ -435,18 +496,19 @@ void PushMessagingMessageFilter::PersistRegistrationOnIO(
push_registration_id,
base::Bind(&PushMessagingMessageFilter::DidPersistRegistrationOnIO,
weak_factory_io_to_io_.GetWeakPtr(),
- data, push_registration_id));
+ data, push_registration_id, curve25519dh));
}
void PushMessagingMessageFilter::DidPersistRegistrationOnIO(
const RegisterData& data,
const std::string& push_registration_id,
+ const std::vector<uint8_t>& curve25519dh,
ServiceWorkerStatusCode service_worker_status) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (service_worker_status == SERVICE_WORKER_OK) {
SendRegisterSuccess(data,
PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE,
- push_registration_id);
+ push_registration_id, curve25519dh);
} else {
// TODO(johnme): Unregister, so PushMessagingServiceImpl can decrease count.
SendRegisterError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR);
@@ -470,7 +532,8 @@ void PushMessagingMessageFilter::SendRegisterError(
void PushMessagingMessageFilter::SendRegisterSuccess(
const RegisterData& data,
PushRegistrationStatus status,
- const std::string& push_registration_id) {
+ const std::string& push_registration_id,
+ const std::vector<uint8_t>& curve25519dh) {
// Only called from IO thread, but would be safe to call from UI thread.
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (push_endpoint_base_.is_empty()) {
@@ -484,11 +547,13 @@ void PushMessagingMessageFilter::SendRegisterSuccess(
Send(new PushMessagingMsg_SubscribeFromDocumentSuccess(
data.render_frame_id,
data.request_id,
- CreatePushEndpoint(push_endpoint_base_, push_registration_id)));
+ CreatePushEndpoint(push_endpoint_base_, push_registration_id),
+ curve25519dh));
} else {
Send(new PushMessagingMsg_SubscribeFromWorkerSuccess(
data.request_id,
- CreatePushEndpoint(push_endpoint_base_, push_registration_id)));
+ CreatePushEndpoint(push_endpoint_base_, push_registration_id),
+ curve25519dh));
}
RecordRegistrationStatus(status);
}
@@ -712,6 +777,7 @@ void PushMessagingMessageFilter::DidUnregister(
void PushMessagingMessageFilter::OnGetRegistration(
int request_id,
+ const GURL& origin,
int64_t service_worker_registration_id) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
// TODO(johnme): Validate arguments?
@@ -719,18 +785,21 @@ void PushMessagingMessageFilter::OnGetRegistration(
service_worker_registration_id,
kPushRegistrationIdServiceWorkerKey,
base::Bind(&PushMessagingMessageFilter::DidGetRegistration,
- weak_factory_io_to_io_.GetWeakPtr(), request_id));
+ weak_factory_io_to_io_.GetWeakPtr(), request_id, origin,
+ service_worker_registration_id));
}
void PushMessagingMessageFilter::DidGetRegistration(
int request_id,
+ const GURL& origin,
+ int64_t service_worker_registration_id,
const std::string& push_registration_id,
ServiceWorkerStatusCode service_worker_status) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
PushGetRegistrationStatus get_status =
PUSH_GETREGISTRATION_STATUS_STORAGE_ERROR;
switch (service_worker_status) {
- case SERVICE_WORKER_OK:
+ case SERVICE_WORKER_OK: {
if (push_endpoint_base_.is_empty()) {
// Return not found in incognito mode, so websites can't detect it.
get_status =
@@ -740,17 +809,29 @@ void PushMessagingMessageFilter::DidGetRegistration(
break;
}
- Send(new PushMessagingMsg_GetRegistrationSuccess(
- request_id,
- CreatePushEndpoint(push_endpoint_base_, push_registration_id)));
- RecordGetRegistrationStatus(PUSH_GETREGISTRATION_STATUS_SUCCESS);
+ const GURL endpoint =
+ CreatePushEndpoint(push_endpoint_base_, push_registration_id);
+
+ auto callback =
+ base::Bind(&PushMessagingMessageFilter::DidGetRegistrationKeys,
+ weak_factory_io_to_io_.GetWeakPtr(), request_id, endpoint);
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&Core::GetPublicEncryptionKeyOnUI,
+ base::Unretained(ui_core_.get()), origin,
+ service_worker_registration_id, callback));
+
return;
- case SERVICE_WORKER_ERROR_NOT_FOUND:
+ }
+ case SERVICE_WORKER_ERROR_NOT_FOUND: {
get_status = PUSH_GETREGISTRATION_STATUS_REGISTRATION_NOT_FOUND;
break;
- case SERVICE_WORKER_ERROR_FAILED:
+ }
+ case SERVICE_WORKER_ERROR_FAILED: {
get_status = PUSH_GETREGISTRATION_STATUS_STORAGE_ERROR;
break;
+ }
case SERVICE_WORKER_ERROR_ABORT:
case SERVICE_WORKER_ERROR_START_WORKER_FAILED:
case SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND:
@@ -766,16 +847,38 @@ void PushMessagingMessageFilter::DidGetRegistration(
case SERVICE_WORKER_ERROR_SCRIPT_EVALUATE_FAILED:
case SERVICE_WORKER_ERROR_DISK_CACHE:
case SERVICE_WORKER_ERROR_REDUNDANT:
- case SERVICE_WORKER_ERROR_MAX_VALUE:
+ case SERVICE_WORKER_ERROR_MAX_VALUE: {
NOTREACHED() << "Got unexpected error code: " << service_worker_status
<< " " << ServiceWorkerStatusToString(service_worker_status);
get_status = PUSH_GETREGISTRATION_STATUS_STORAGE_ERROR;
break;
+ }
}
Send(new PushMessagingMsg_GetRegistrationError(request_id, get_status));
RecordGetRegistrationStatus(get_status);
}
+void PushMessagingMessageFilter::DidGetRegistrationKeys(
johnme 2015/07/09 16:02:53 Please add a DCHECK_CURRENTLY_ON.
Peter Beverloo 2015/07/09 18:54:17 Done.
+ int request_id,
+ const GURL& endpoint,
+ bool success,
+ const std::vector<uint8_t>& curve25519dh) {
+ if (!success) {
+ PushGetRegistrationStatus status =
+ PUSH_GETREGISTRATION_STATUS_PUBLIC_KEY_UNAVAILABLE;
+
+ Send(new PushMessagingMsg_GetRegistrationError(request_id, status));
+
+ RecordGetRegistrationStatus(status);
+ return;
+ }
+
+ Send(new PushMessagingMsg_GetRegistrationSuccess(request_id, endpoint,
+ curve25519dh));
+
+ RecordGetRegistrationStatus(PUSH_GETREGISTRATION_STATUS_SUCCESS);
+}
+
// GetPermission methods on both IO and UI threads, merged in order of use from
// PushMessagingMessageFilter and Core.
// -----------------------------------------------------------------------------

Powered by Google App Engine
This is Rietveld 408576698