Bug 1171853 - re-fix sending inner permissions for view-source URIs, r?mystor draft
authorGijs Kruitbosch <gijskruitbosch@gmail.com>
Thu, 04 Jan 2018 17:40:47 +0000
changeset 716027 a0dae0cdc633baae78e5499cf4b0bdb5be2f3d91
parent 716026 2bc1cde6a641ba874d0238385619725aad9c04bb
child 744928 8513e232e70b47a0063e2eb713fec4cea1df062b
push id94305
push usergijskruitbosch@gmail.com
push dateThu, 04 Jan 2018 23:59:22 +0000
reviewersmystor
bugs1171853
milestone59.0a1
Bug 1171853 - re-fix sending inner permissions for view-source URIs, r?mystor MozReview-Commit-ID: H8WX95dkgdF
dom/ipc/ContentParent.cpp
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -130,16 +130,17 @@
 #include "nsIFormProcessor.h"
 #include "nsIGfxInfo.h"
 #include "nsIIdleService.h"
 #include "nsIInterfaceRequestorUtils.h"
 #include "nsIMemoryInfoDumper.h"
 #include "nsIMemoryReporter.h"
 #include "nsIMozBrowserFrame.h"
 #include "nsIMutable.h"
+#include "nsINestedURI.h"
 #include "nsIObserverService.h"
 #include "nsIParentChannel.h"
 #include "nsIPresShell.h"
 #include "nsIRemoteWindowContext.h"
 #include "nsIScriptError.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsISiteSecurityService.h"
 #include "nsISpellChecker.h"
@@ -5163,16 +5164,33 @@ ContentParent::AboutToLoadHttpFtpWyciwyg
   nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
   if (NS_WARN_IF(!ssm)) {
     return NS_ERROR_FAILURE;
   }
 
   nsCOMPtr<nsIPrincipal> principal;
   rv = ssm->GetChannelResultPrincipal(aChannel, getter_AddRefs(principal));
   NS_ENSURE_SUCCESS(rv, rv);
+  // If this is a view-source principal, get a principal for the inner URI.
+  if (principal && principal->GetIsCodebasePrincipal()) {
+    nsCOMPtr<nsIURI> uri;
+    rv = principal->GetURI(getter_AddRefs(uri));
+    NS_ENSURE_SUCCESS(rv, rv);
+    bool isViewSource = false;
+    if (NS_SUCCEEDED(uri->SchemeIs("view-source", &isViewSource)) && isViewSource) {
+      nsCOMPtr<nsINestedURI> nestedURI = do_QueryInterface(uri);
+      if (!nestedURI) {
+        return NS_ERROR_FAILURE;
+      }
+      rv = nestedURI->GetInnerURI(getter_AddRefs(uri));
+      NS_ENSURE_SUCCESS(rv, rv);
+      mozilla::OriginAttributes attrs = principal->OriginAttributesRef();
+      principal = mozilla::BasePrincipal::CreateCodebasePrincipal(uri, attrs);
+    }
+  }
 
   rv = TransmitPermissionsForPrincipal(principal);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsLoadFlags newLoadFlags;
   aChannel->GetLoadFlags(&newLoadFlags);
   if (newLoadFlags & nsIRequest::LOAD_DOCUMENT_NEEDS_COOKIE) {
     UpdateCookieStatus(aChannel);