Bug 413938: Add an nsIWebNavigation flag to let clients bypass malware/phishing detection. r=bz, sr=biesi, a1.9=damons

git-svn-id: svn://10.0.0.236/trunk@244412 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
dcamp%mozilla.com
2008-01-29 23:49:20 +00:00
parent 13ba79cb17
commit eba206c16f
5 changed files with 102 additions and 21 deletions

View File

@@ -149,6 +149,7 @@
#include "nsIDOMDocument.h"
#include "nsICachingChannel.h"
#include "nsICacheVisitor.h"
#include "nsICacheEntryDescriptor.h"
#include "nsIMultiPartChannel.h"
#include "nsIWyciwygChannel.h"
@@ -883,6 +884,9 @@ nsDocShell::LoadURI(nsIURI * aURI,
if (aLoadFlags & LOAD_FLAGS_FIRST_LOAD)
flags |= INTERNAL_LOAD_FLAGS_FIRST_LOAD;
if (aLoadFlags & LOAD_FLAGS_BYPASS_CLASSIFIER)
flags |= INTERNAL_LOAD_FLAGS_BYPASS_CLASSIFIER;
rv = InternalLoad(aURI,
referrer,
owner,
@@ -951,7 +955,8 @@ nsDocShell::LoadStream(nsIInputStream *aStream, nsIURI * aURI,
uriLoader(do_GetService(NS_URI_LOADER_CONTRACTID));
NS_ENSURE_TRUE(uriLoader, NS_ERROR_FAILURE);
NS_ENSURE_SUCCESS(DoChannelLoad(channel, uriLoader), NS_ERROR_FAILURE);
NS_ENSURE_SUCCESS(DoChannelLoad(channel, uriLoader, PR_FALSE),
NS_ERROR_FAILURE);
return NS_OK;
}
@@ -7051,7 +7056,8 @@ nsDocShell::InternalLoad(nsIURI * aURI,
!(aFlags & INTERNAL_LOAD_FLAGS_DONT_SEND_REFERRER),
owner, aTypeHint, aPostData, aHeadersData, aFirstParty,
aDocShell, getter_AddRefs(req),
(aFlags & INTERNAL_LOAD_FLAGS_FIRST_LOAD) != 0);
(aFlags & INTERNAL_LOAD_FLAGS_FIRST_LOAD) != 0,
(aFlags & INTERNAL_LOAD_FLAGS_BYPASS_CLASSIFIER) != 0);
if (req && aRequest)
NS_ADDREF(*aRequest = req);
@@ -7121,7 +7127,8 @@ nsDocShell::DoURILoad(nsIURI * aURI,
PRBool aFirstParty,
nsIDocShell ** aDocShell,
nsIRequest ** aRequest,
PRBool aIsNewWindowTarget)
PRBool aIsNewWindowTarget,
PRBool aBypassClassifier)
{
nsresult rv;
nsCOMPtr<nsIURILoader> uriLoader;
@@ -7311,7 +7318,7 @@ nsDocShell::DoURILoad(nsIURI * aURI,
}
}
rv = DoChannelLoad(channel, uriLoader);
rv = DoChannelLoad(channel, uriLoader, aBypassClassifier);
//
// If the channel load failed, we failed and nsIWebProgress just ain't
@@ -7404,7 +7411,8 @@ nsDocShell::AddHeadersToChannel(nsIInputStream *aHeadersData,
}
nsresult nsDocShell::DoChannelLoad(nsIChannel * aChannel,
nsIURILoader * aURILoader)
nsIURILoader * aURILoader,
PRBool aBypassClassifier)
{
nsresult rv;
// Mark the channel as being a document URI and allow content sniffing...
@@ -7467,10 +7475,12 @@ nsresult nsDocShell::DoChannelLoad(nsIChannel * aChannel,
this);
NS_ENSURE_SUCCESS(rv, rv);
rv = CheckClassifier(aChannel);
if (NS_FAILED(rv)) {
aChannel->Cancel(rv);
return rv;
if (!aBypassClassifier) {
rv = CheckClassifier(aChannel);
if (NS_FAILED(rv)) {
aChannel->Cancel(rv);
return rv;
}
}
return NS_OK;
@@ -9305,15 +9315,10 @@ nsClassifierCallback::Run()
if (NS_FAILED(status))
return NS_OK;
// Don't bother to run the classifier on a load that's coming from the
// cache and doesn't need validaton.
nsCOMPtr<nsICachingChannel> cachingChannel = do_QueryInterface(channel);
if (cachingChannel) {
PRBool fromCache;
if (NS_SUCCEEDED(cachingChannel->IsFromCache(&fromCache)) &&
fromCache) {
return NS_OK;
}
// Don't bother to run the classifier on a cached load that was
// previously classified.
if (HasBeenClassified()) {
return NS_OK;
}
nsCOMPtr<nsIURI> uri;
@@ -9370,10 +9375,72 @@ nsClassifierCallback::Run()
return NS_OK;
}
// Note in the cache entry that this URL was classified, so that future
// cached loads don't need to be checked.
void
nsClassifierCallback::MarkEntryClassified(nsresult status)
{
nsCOMPtr<nsICachingChannel> cachingChannel =
do_QueryInterface(mSuspendedChannel);
if (!cachingChannel) {
return;
}
nsCOMPtr<nsISupports> cacheToken;
cachingChannel->GetCacheToken(getter_AddRefs(cacheToken));
if (!cacheToken) {
return;
}
nsCOMPtr<nsICacheEntryDescriptor> cacheEntry =
do_QueryInterface(cacheToken);
if (!cacheEntry) {
return;
}
cacheEntry->SetMetaDataElement("docshell:classified",
NS_SUCCEEDED(status) ? "1" : nsnull);
}
PRBool
nsClassifierCallback::HasBeenClassified()
{
nsCOMPtr<nsICachingChannel> cachingChannel =
do_QueryInterface(mSuspendedChannel);
if (!cachingChannel) {
return PR_FALSE;
}
// Only check the tag if we are loading from the cache without
// validation.
PRBool fromCache;
if (NS_FAILED(cachingChannel->IsFromCache(&fromCache)) || !fromCache) {
return PR_FALSE;
}
nsCOMPtr<nsISupports> cacheToken;
cachingChannel->GetCacheToken(getter_AddRefs(cacheToken));
if (!cacheToken) {
return PR_FALSE;
}
nsCOMPtr<nsICacheEntryDescriptor> cacheEntry =
do_QueryInterface(cacheToken);
if (!cacheEntry) {
return PR_FALSE;
}
nsXPIDLCString tag;
cacheEntry->GetMetaDataElement("docshell:classified", getter_Copies(tag));
return tag.EqualsLiteral("1");
}
NS_IMETHODIMP
nsClassifierCallback::OnClassifyComplete(nsresult aErrorCode)
{
if (mSuspendedChannel) {
MarkEntryClassified(aErrorCode);
if (NS_FAILED(aErrorCode)) {
#ifdef DEBUG
PR_LOG(gDocShellLog, PR_LOG_DEBUG,