Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / gcm / gcm_api.cc
index 2034c40..a8a5be2 100644 (file)
 
 #include "base/sha1.h"
 #include "base/strings/string_number_conversions.h"
-#include "chrome/browser/extensions/extension_system.h"
+#include "base/strings/string_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/services/gcm/gcm_profile_service.h"
 #include "chrome/browser/services/gcm/gcm_profile_service_factory.h"
 #include "chrome/common/extensions/api/gcm.h"
 #include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_system.h"
 #include "extensions/common/extension.h"
 
 namespace {
 
 const size_t kMaximumMessageSize = 4096;  // in bytes.
+const char kCollapseKey[] = "collapse_key";
 const char kGoogDotRestrictedPrefix[] = "goog.";
-const size_t kGoogDotPrefixLength = arraysize(kGoogDotRestrictedPrefix) - 1;
 const char kGoogleRestrictedPrefix[] = "google";
-const size_t kGooglePrefixLength = arraysize(kGoogleRestrictedPrefix) - 1;
 
 // Error messages.
 const char kInvalidParameter[] =
     "Function was called with invalid parameters.";
 const char kNotSignedIn[] = "Profile was not signed in.";
+const char kCertificateMissing[] = "Manifest key was missing.";
 const char kAsyncOperationPending[] =
     "Asynchronous operation is pending.";
-const char kNetworkError[] = "Network error occured.";
-const char kServerError[] = "Server error occured.";
+const char kNetworkError[] = "Network error occurred.";
+const char kServerError[] = "Server error occurred.";
 const char kTtlExceeded[] = "Time-to-live exceeded.";
-const char kUnknownError[] = "Unknown error occured.";
+const char kUnknownError[] = "Unknown error occurred.";
 
 std::string SHA1HashHexString(const std::string& str) {
   std::string hash = base::SHA1HashString(str);
@@ -51,6 +52,8 @@ const char* GcmResultToError(gcm::GCMClient::Result result) {
       return kInvalidParameter;
     case gcm::GCMClient::NOT_SIGNED_IN:
       return kNotSignedIn;
+    case gcm::GCMClient::CERTIFICATE_MISSING:
+      return kCertificateMissing;
     case gcm::GCMClient::ASYNC_OPERATION_PENDING:
       return kAsyncOperationPending;
     case gcm::GCMClient::NETWORK_ERROR:
@@ -71,9 +74,15 @@ const char* GcmResultToError(gcm::GCMClient::Result result) {
 }
 
 bool IsMessageKeyValid(const std::string& key) {
+  std::string lower = StringToLowerASCII(key);
   return !key.empty() &&
-      key.compare(0, kGooglePrefixLength, kGoogleRestrictedPrefix) != 0 &&
-      key.compare(0, kGoogDotPrefixLength, kGoogDotRestrictedPrefix) != 0;
+         key.compare(0, arraysize(kCollapseKey) - 1, kCollapseKey) != 0 &&
+         lower.compare(0,
+                       arraysize(kGoogleRestrictedPrefix) - 1,
+                       kGoogleRestrictedPrefix) != 0 &&
+         lower.compare(0,
+                       arraysize(kGoogDotRestrictedPrefix),
+                       kGoogDotRestrictedPrefix) != 0;
 }
 
 }  // namespace
@@ -89,8 +98,7 @@ bool GcmApiFunction::RunImpl() {
 
 bool GcmApiFunction::IsGcmApiEnabled() const {
   return gcm::GCMProfileService::IsGCMEnabled(
-             Profile::FromBrowserContext(context())) &&
-         !GetExtension()->public_key().empty();
+             Profile::FromBrowserContext(context()));
 }
 
 gcm::GCMProfileService* GcmApiFunction::GCMProfileService() const {
@@ -107,6 +115,12 @@ bool GcmRegisterFunction::DoWork() {
       api::gcm::Register::Params::Create(*args_));
   EXTENSION_FUNCTION_VALIDATE(params.get());
 
+  if (GetExtension()->public_key().empty()) {
+    CompleteFunctionWithResult(std::string(),
+                               gcm::GCMClient::CERTIFICATE_MISSING);
+    return false;
+  }
+
   GCMProfileService()->Register(
       GetExtension()->id(),
       params->sender_ids,