From 635f27b521d00247fd67937b813d46d5475f1ae5 Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Mon, 28 Jul 2014 10:37:54 -0700 Subject: [PATCH] Bug 1022229 - Hoist GetAppStatus into a static method on nsScriptSecurityManager. r=bz --- caps/nsPrincipal.cpp | 43 ++------------------------- caps/nsScriptSecurityManager.cpp | 51 ++++++++++++++++++++++++++++++++ caps/nsScriptSecurityManager.h | 2 ++ 3 files changed, 56 insertions(+), 40 deletions(-) diff --git a/caps/nsPrincipal.cpp b/caps/nsPrincipal.cpp index 1f1ef4251102..29ace168eb47 100644 --- a/caps/nsPrincipal.cpp +++ b/caps/nsPrincipal.cpp @@ -577,48 +577,11 @@ nsPrincipal::Write(nsIObjectOutputStream* aStream) uint16_t nsPrincipal::GetAppStatus() { - NS_WARN_IF_FALSE(mAppId != nsIScriptSecurityManager::UNKNOWN_APP_ID, - "Asking for app status on a principal with an unknown app id"); - // Installed apps have a valid app id (not NO_APP_ID or UNKNOWN_APP_ID) - // and they are not inside a mozbrowser. - if (mAppId == nsIScriptSecurityManager::NO_APP_ID || - mAppId == nsIScriptSecurityManager::UNKNOWN_APP_ID || mInMozBrowser) { + if (mAppId == nsIScriptSecurityManager::UNKNOWN_APP_ID) { + NS_WARNING("Asking for app status on a principal with an unknown app id"); return nsIPrincipal::APP_STATUS_NOT_INSTALLED; } - - nsCOMPtr appsService = do_GetService(APPS_SERVICE_CONTRACTID); - NS_ENSURE_TRUE(appsService, nsIPrincipal::APP_STATUS_NOT_INSTALLED); - - nsCOMPtr app; - appsService->GetAppByLocalId(mAppId, getter_AddRefs(app)); - NS_ENSURE_TRUE(app, nsIPrincipal::APP_STATUS_NOT_INSTALLED); - - uint16_t status = nsIPrincipal::APP_STATUS_INSTALLED; - NS_ENSURE_SUCCESS(app->GetAppStatus(&status), - nsIPrincipal::APP_STATUS_NOT_INSTALLED); - - nsAutoCString origin; - NS_ENSURE_SUCCESS(GetOrigin(getter_Copies(origin)), - nsIPrincipal::APP_STATUS_NOT_INSTALLED); - nsString appOrigin; - NS_ENSURE_SUCCESS(app->GetOrigin(appOrigin), - nsIPrincipal::APP_STATUS_NOT_INSTALLED); - - // We go from string -> nsIURI -> origin to be sure we - // compare two punny-encoded origins. - nsCOMPtr appURI; - NS_ENSURE_SUCCESS(NS_NewURI(getter_AddRefs(appURI), appOrigin), - nsIPrincipal::APP_STATUS_NOT_INSTALLED); - - nsAutoCString appOriginPunned; - NS_ENSURE_SUCCESS(GetOriginForURI(appURI, getter_Copies(appOriginPunned)), - nsIPrincipal::APP_STATUS_NOT_INSTALLED); - - if (!appOriginPunned.Equals(origin)) { - return nsIPrincipal::APP_STATUS_NOT_INSTALLED; - } - - return status; + return nsScriptSecurityManager::AppStatusForPrincipal(this); } /************************************************************************************************************************/ diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 83a3b455a974..d1414cb3b159 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -252,6 +252,57 @@ nsScriptSecurityManager::SecurityHashURI(nsIURI* aURI) return NS_SecurityHashURI(aURI); } +uint16_t +nsScriptSecurityManager::AppStatusForPrincipal(nsIPrincipal *aPrin) +{ + uint32_t appId = aPrin->GetAppId(); + bool inMozBrowser = aPrin->GetIsInBrowserElement(); + NS_WARN_IF_FALSE(appId != nsIScriptSecurityManager::UNKNOWN_APP_ID, + "Asking for app status on a principal with an unknown app id"); + // Installed apps have a valid app id (not NO_APP_ID or UNKNOWN_APP_ID) + // and they are not inside a mozbrowser. + if (appId == nsIScriptSecurityManager::NO_APP_ID || + appId == nsIScriptSecurityManager::UNKNOWN_APP_ID || inMozBrowser) + { + return nsIPrincipal::APP_STATUS_NOT_INSTALLED; + } + + nsCOMPtr appsService = do_GetService(APPS_SERVICE_CONTRACTID); + NS_ENSURE_TRUE(appsService, nsIPrincipal::APP_STATUS_NOT_INSTALLED); + + nsCOMPtr app; + appsService->GetAppByLocalId(appId, getter_AddRefs(app)); + NS_ENSURE_TRUE(app, nsIPrincipal::APP_STATUS_NOT_INSTALLED); + + uint16_t status = nsIPrincipal::APP_STATUS_INSTALLED; + NS_ENSURE_SUCCESS(app->GetAppStatus(&status), + nsIPrincipal::APP_STATUS_NOT_INSTALLED); + + nsAutoCString origin; + NS_ENSURE_SUCCESS(aPrin->GetOrigin(getter_Copies(origin)), + nsIPrincipal::APP_STATUS_NOT_INSTALLED); + nsString appOrigin; + NS_ENSURE_SUCCESS(app->GetOrigin(appOrigin), + nsIPrincipal::APP_STATUS_NOT_INSTALLED); + + // We go from string -> nsIURI -> origin to be sure we + // compare two punny-encoded origins. + nsCOMPtr appURI; + NS_ENSURE_SUCCESS(NS_NewURI(getter_AddRefs(appURI), appOrigin), + nsIPrincipal::APP_STATUS_NOT_INSTALLED); + + nsAutoCString appOriginPunned; + NS_ENSURE_SUCCESS(nsPrincipal::GetOriginForURI(appURI, getter_Copies(appOriginPunned)), + nsIPrincipal::APP_STATUS_NOT_INSTALLED); + + if (!appOriginPunned.Equals(origin)) { + return nsIPrincipal::APP_STATUS_NOT_INSTALLED; + } + + return status; + +} + NS_IMETHODIMP nsScriptSecurityManager::GetChannelPrincipal(nsIChannel* aChannel, nsIPrincipal** aPrincipal) diff --git a/caps/nsScriptSecurityManager.h b/caps/nsScriptSecurityManager.h index d41703ad34f2..f51892294390 100644 --- a/caps/nsScriptSecurityManager.h +++ b/caps/nsScriptSecurityManager.h @@ -68,6 +68,8 @@ public: static bool SecurityCompareURIs(nsIURI* aSourceURI, nsIURI* aTargetURI); static uint32_t SecurityHashURI(nsIURI* aURI); + static uint16_t AppStatusForPrincipal(nsIPrincipal *aPrin); + static nsresult ReportError(JSContext* cx, const nsAString& messageTag, nsIURI* aSource, nsIURI* aTarget);