From dfa2be9fb0ece9d410458dccf938dd6cabbdca1b Mon Sep 17 00:00:00 2001 From: "norris%netscape.com" Date: Tue, 21 Mar 2000 04:17:37 +0000 Subject: [PATCH] Added aggregate principal support. r=norris. (This is mstoltz's checkin) git-svn-id: svn://10.0.0.236/trunk@63541 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/modules/libjar/nsJARChannel.cpp | 54 ++++++++++++++----- mozilla/modules/libjar/nsJARChannel.h | 1 + .../netwerk/protocol/jar/src/nsJARChannel.cpp | 54 ++++++++++++++----- .../netwerk/protocol/jar/src/nsJARChannel.h | 1 + 4 files changed, 86 insertions(+), 24 deletions(-) diff --git a/mozilla/modules/libjar/nsJARChannel.cpp b/mozilla/modules/libjar/nsJARChannel.cpp index d48e211dd6d..8fea9b0b78b 100644 --- a/mozilla/modules/libjar/nsJARChannel.cpp +++ b/mozilla/modules/libjar/nsJARChannel.cpp @@ -28,13 +28,15 @@ #include "nsIMIMEService.h" #include "nsAutoLock.h" #include "nsIFileStreams.h" -#include "nsIPrincipal.h" #include "nsMimeTypes.h" +#include "nsScriptSecurityManager.h" +#include "nsIAggregatePrincipal.h" static NS_DEFINE_CID(kFileTransportServiceCID, NS_FILETRANSPORTSERVICE_CID); static NS_DEFINE_CID(kMIMEServiceCID, NS_MIMESERVICE_CID); static NS_DEFINE_CID(kZipReaderCID, NS_ZIPREADER_CID); static NS_DEFINE_CID(kFileChannelCID, NS_FILECHANNEL_CID); +static NS_DEFINE_CID(kScriptSecurityManagerCID, NS_SCRIPTSECURITYMANAGER_CID); //////////////////////////////////////////////////////////////////////////////// @@ -303,8 +305,9 @@ nsJARChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, rv = NS_OpenURI(getter_AddRefs(jarBaseChannel), mJARBaseURI, mLoadGroup, mCallbacks, mLoadAttributes); if (NS_FAILED(rv)) return rv; - - nsCOMPtr jarBaseFile = do_QueryInterface(jarBaseChannel, &rv); + + if (mLoadGroup) + (void)mLoadGroup->AddChannel(this, nsnull); // XXX need to set a state variable here to say we're reading mStartPosition = startPosition; @@ -312,6 +315,7 @@ nsJARChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, mUserContext = ctxt; mUserListener = listener; + nsCOMPtr jarBaseFile = do_QueryInterface(jarBaseChannel, &rv); if (NS_SUCCEEDED(rv)) { // then we've already got a local jar file -- no need to download it rv = ExtractJARElement(jarBaseFile); @@ -554,21 +558,45 @@ nsJARChannel::SetLoadGroup(nsILoadGroup* aLoadGroup) NS_IMETHODIMP nsJARChannel::GetOwner(nsISupports* *aOwner) { - nsCOMPtr principal; - nsresult rv = mJAR->GetPrincipal(mJAREntry, getter_AddRefs(principal)); - if (NS_SUCCEEDED(rv) && principal) - rv = principal->QueryInterface(NS_GET_IID(nsISupports), (void **)aOwner); - else - *aOwner = nsnull; - + if (!mOwner) + { + nsCOMPtr certificate; + PRInt16 result; + nsresult rv = mJAR->GetCertificatePrincipal(mJAREntry, + getter_AddRefs(certificate), + &result); + if (NS_FAILED(rv)) return NS_ERROR_FAILURE; + if (certificate) + { // Get the codebase principal + NS_WITH_SERVICE(nsIScriptSecurityManager, secMan, + kScriptSecurityManagerCID, &rv); + if (NS_FAILED(rv)) return NS_ERROR_FAILURE; + nsCOMPtr codebase; + rv = secMan->GetCodebasePrincipal(mJARBaseURI, + getter_AddRefs(codebase)); + if (NS_FAILED(rv)) return rv; + + // Join the certificate and the codebase + nsCOMPtr agg; + agg = do_QueryInterface(certificate, &rv); + NS_ASSERTION(NS_SUCCEEDED(rv), + "Certificate principal is not an aggregate"); + rv = agg->SetCodebase(codebase); + if (NS_FAILED(rv)) return rv; + mOwner = do_QueryInterface(agg, &rv); + if (NS_FAILED(rv)) return rv; + } + } + *aOwner = mOwner; + NS_IF_ADDREF(*aOwner); return NS_OK; } NS_IMETHODIMP nsJARChannel::SetOwner(nsISupports* aOwner) { - //XXX: is this OK? - return NS_ERROR_FAILURE; + mOwner = aOwner; + return NS_OK; } NS_IMETHODIMP @@ -611,6 +639,8 @@ nsJARChannel::OnStopRequest(nsIChannel* jarExtractionTransport, nsresult rv; rv = mUserListener->OnStopRequest(this, mUserContext, status, aMsg); mJarExtractionTransport = nsnull; + if (mLoadGroup) + mLoadGroup->RemoveChannel(this, nsnull, rv, nsnull); return rv; } diff --git a/mozilla/modules/libjar/nsJARChannel.h b/mozilla/modules/libjar/nsJARChannel.h index f4047e94829..3c03b0622ae 100644 --- a/mozilla/modules/libjar/nsJARChannel.h +++ b/mozilla/modules/libjar/nsJARChannel.h @@ -91,6 +91,7 @@ protected: nsCOMPtr mCallbacks; nsCOMPtr mOriginalURI; nsLoadFlags mLoadAttributes; + nsCOMPtr mOwner; PRUint32 mStartPosition; PRInt32 mReadCount; diff --git a/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp b/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp index d48e211dd6d..8fea9b0b78b 100644 --- a/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp +++ b/mozilla/netwerk/protocol/jar/src/nsJARChannel.cpp @@ -28,13 +28,15 @@ #include "nsIMIMEService.h" #include "nsAutoLock.h" #include "nsIFileStreams.h" -#include "nsIPrincipal.h" #include "nsMimeTypes.h" +#include "nsScriptSecurityManager.h" +#include "nsIAggregatePrincipal.h" static NS_DEFINE_CID(kFileTransportServiceCID, NS_FILETRANSPORTSERVICE_CID); static NS_DEFINE_CID(kMIMEServiceCID, NS_MIMESERVICE_CID); static NS_DEFINE_CID(kZipReaderCID, NS_ZIPREADER_CID); static NS_DEFINE_CID(kFileChannelCID, NS_FILECHANNEL_CID); +static NS_DEFINE_CID(kScriptSecurityManagerCID, NS_SCRIPTSECURITYMANAGER_CID); //////////////////////////////////////////////////////////////////////////////// @@ -303,8 +305,9 @@ nsJARChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, rv = NS_OpenURI(getter_AddRefs(jarBaseChannel), mJARBaseURI, mLoadGroup, mCallbacks, mLoadAttributes); if (NS_FAILED(rv)) return rv; - - nsCOMPtr jarBaseFile = do_QueryInterface(jarBaseChannel, &rv); + + if (mLoadGroup) + (void)mLoadGroup->AddChannel(this, nsnull); // XXX need to set a state variable here to say we're reading mStartPosition = startPosition; @@ -312,6 +315,7 @@ nsJARChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, mUserContext = ctxt; mUserListener = listener; + nsCOMPtr jarBaseFile = do_QueryInterface(jarBaseChannel, &rv); if (NS_SUCCEEDED(rv)) { // then we've already got a local jar file -- no need to download it rv = ExtractJARElement(jarBaseFile); @@ -554,21 +558,45 @@ nsJARChannel::SetLoadGroup(nsILoadGroup* aLoadGroup) NS_IMETHODIMP nsJARChannel::GetOwner(nsISupports* *aOwner) { - nsCOMPtr principal; - nsresult rv = mJAR->GetPrincipal(mJAREntry, getter_AddRefs(principal)); - if (NS_SUCCEEDED(rv) && principal) - rv = principal->QueryInterface(NS_GET_IID(nsISupports), (void **)aOwner); - else - *aOwner = nsnull; - + if (!mOwner) + { + nsCOMPtr certificate; + PRInt16 result; + nsresult rv = mJAR->GetCertificatePrincipal(mJAREntry, + getter_AddRefs(certificate), + &result); + if (NS_FAILED(rv)) return NS_ERROR_FAILURE; + if (certificate) + { // Get the codebase principal + NS_WITH_SERVICE(nsIScriptSecurityManager, secMan, + kScriptSecurityManagerCID, &rv); + if (NS_FAILED(rv)) return NS_ERROR_FAILURE; + nsCOMPtr codebase; + rv = secMan->GetCodebasePrincipal(mJARBaseURI, + getter_AddRefs(codebase)); + if (NS_FAILED(rv)) return rv; + + // Join the certificate and the codebase + nsCOMPtr agg; + agg = do_QueryInterface(certificate, &rv); + NS_ASSERTION(NS_SUCCEEDED(rv), + "Certificate principal is not an aggregate"); + rv = agg->SetCodebase(codebase); + if (NS_FAILED(rv)) return rv; + mOwner = do_QueryInterface(agg, &rv); + if (NS_FAILED(rv)) return rv; + } + } + *aOwner = mOwner; + NS_IF_ADDREF(*aOwner); return NS_OK; } NS_IMETHODIMP nsJARChannel::SetOwner(nsISupports* aOwner) { - //XXX: is this OK? - return NS_ERROR_FAILURE; + mOwner = aOwner; + return NS_OK; } NS_IMETHODIMP @@ -611,6 +639,8 @@ nsJARChannel::OnStopRequest(nsIChannel* jarExtractionTransport, nsresult rv; rv = mUserListener->OnStopRequest(this, mUserContext, status, aMsg); mJarExtractionTransport = nsnull; + if (mLoadGroup) + mLoadGroup->RemoveChannel(this, nsnull, rv, nsnull); return rv; } diff --git a/mozilla/netwerk/protocol/jar/src/nsJARChannel.h b/mozilla/netwerk/protocol/jar/src/nsJARChannel.h index f4047e94829..3c03b0622ae 100644 --- a/mozilla/netwerk/protocol/jar/src/nsJARChannel.h +++ b/mozilla/netwerk/protocol/jar/src/nsJARChannel.h @@ -91,6 +91,7 @@ protected: nsCOMPtr mCallbacks; nsCOMPtr mOriginalURI; nsLoadFlags mLoadAttributes; + nsCOMPtr mOwner; PRUint32 mStartPosition; PRInt32 mReadCount;