diff --git a/mozilla/browser/components/places/src/Makefile.in b/mozilla/browser/components/places/src/Makefile.in index 4b0a9ce7fb5..e96df8d6ab4 100644 --- a/mozilla/browser/components/places/src/Makefile.in +++ b/mozilla/browser/components/places/src/Makefile.in @@ -69,6 +69,7 @@ REQUIRES = xpcom \ LOCAL_INCLUDES = -I$(srcdir)/../../build CPPSRCS = \ + nsAnnoProtocolHandler.cpp \ nsAnnotationService.cpp \ nsNavHistory.cpp \ nsNavBookmarks.cpp \ diff --git a/mozilla/browser/components/places/src/nsAnnoProtocolHandler.cpp b/mozilla/browser/components/places/src/nsAnnoProtocolHandler.cpp new file mode 100644 index 00000000000..c793641f4a9 --- /dev/null +++ b/mozilla/browser/components/places/src/nsAnnoProtocolHandler.cpp @@ -0,0 +1,201 @@ +//* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Annotation Service + * + * The Initial Developer of the Original Code is + * Google Inc. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brett Wilson (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/** + * Implementation of moz-anno: URLs for accessing annotation values. This just + * reads binary data from the annotation service + */ + +#include "nsAnnoProtocolHandler.h" +#include "nsIChannel.h" +#include "nsIInputStreamChannel.h" +#include "nsILoadGroup.h" +#include "nsIStandardURL.h" +#include "nsIStringStream.h" +#include "nsISupportsUtils.h" +#include "nsIURI.h" +#include "nsNetUtil.h" +#include "nsServiceManagerUtils.h" +#include "nsStringStream.h" + +NS_IMPL_ISUPPORTS1(nsAnnoProtocolHandler, nsIProtocolHandler) + +// nsAnnoProtocolHandler::GetScheme + +NS_IMETHODIMP +nsAnnoProtocolHandler::GetScheme(nsACString& aScheme) +{ + aScheme.AssignLiteral("moz-anno"); + return NS_OK; +} + + +// nsAnnoProtocolHandler::GetDefaultPort +// +// There is no default port for annotation URLs + +NS_IMETHODIMP +nsAnnoProtocolHandler::GetDefaultPort(PRInt32 *aDefaultPort) +{ + *aDefaultPort = -1; + return NS_OK; +} + + +// nsAnnoProtocolHandler::GetProtocolFlags +// +// No special protocol flags. + +NS_IMETHODIMP +nsAnnoProtocolHandler::GetProtocolFlags(PRUint32 *aProtocolFlags) +{ + *aProtocolFlags = (URI_NORELATIVE | URI_NOAUTH); + return NS_OK; +} + + +// nsAnnoProtocolHandler::NewURI + +NS_IMETHODIMP +nsAnnoProtocolHandler::NewURI(const nsACString& aSpec, + const char *aOriginCharset, + nsIURI *aBaseURI, nsIURI **_retval) +{ + nsCOMPtr uri = do_CreateInstance(NS_SIMPLEURI_CONTRACTID); + if (!uri) + return NS_ERROR_OUT_OF_MEMORY; + nsresult rv = uri->SetSpec(aSpec); + NS_ENSURE_SUCCESS(rv, rv); + + *_retval = nsnull; + uri.swap(*_retval); + return NS_OK; +} + + +// nsAnnoProtocolHandler::NewChannel +// + +NS_IMETHODIMP +nsAnnoProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **_retval) +{ + nsresult rv; + + nsCAutoString path; + rv = aURI->GetPath(path); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr annotationService = do_GetService( + "@mozilla.org/browser/annotation-service;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr stream = do_CreateInstance( + NS_STRINGINPUTSTREAM_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + // annotation info + nsCOMPtr annoURI; + nsCAutoString annoName; + rv = ParseAnnoURI(aURI, getter_AddRefs(annoURI), annoName); + NS_ENSURE_SUCCESS(rv, rv); + + // get the data from the annotation service and hand it off to the stream + PRUint8* data; + PRUint32 dataLen; + nsCAutoString mimeType; + rv = annotationService->GetAnnotationBinary(annoURI, annoName, &data, + &dataLen, mimeType); + NS_ENSURE_SUCCESS(rv, rv); + if (mimeType.IsEmpty()) { + // disallow annotations with no MIME types + NS_NOTREACHED("Attempting to create a channel on a URI that has no MIME type"); + NS_Free(data); + return NS_ERROR_NOT_AVAILABLE; + } + rv = stream->AdoptData((char*)data, dataLen); + if (NS_FAILED(rv)) { + NS_Free(data); + return rv; + } + + nsCOMPtr channel; + rv = NS_NewInputStreamChannel(getter_AddRefs(channel), aURI, stream, mimeType); + NS_ENSURE_SUCCESS(rv, rv); + + *_retval = channel; + NS_ADDREF(*_retval); + return NS_OK; +} + + +// nsAnnoProtocolHandler::AllowPort +// +// Don't override any bans on bad ports. + +NS_IMETHODIMP +nsAnnoProtocolHandler::AllowPort(PRInt32 port, const char *scheme, + PRBool *_retval) +{ + *_retval = PR_FALSE; + return NS_OK; +} + + +// nsAnnoProtocolHandler::ParseAnnoURI +// +// Splits an annotation URL into its URI and name parts + +nsresult +nsAnnoProtocolHandler::ParseAnnoURI(nsIURI* aURI, + nsIURI** aResultURI, nsCString& aName) +{ + nsresult rv; + nsCAutoString path; + rv = aURI->GetPath(path); + NS_ENSURE_SUCCESS(rv, rv); + + PRInt32 firstColon = path.FindChar(':'); + if (firstColon <= 0) + return NS_ERROR_MALFORMED_URI; + + rv = NS_NewURI(aResultURI, Substring(path, firstColon + 1)); + NS_ENSURE_SUCCESS(rv, rv); + + aName = Substring(path, 0, firstColon); + return NS_OK; +} diff --git a/mozilla/browser/components/places/src/nsAnnoProtocolHandler.h b/mozilla/browser/components/places/src/nsAnnoProtocolHandler.h new file mode 100644 index 00000000000..f081a10b1c2 --- /dev/null +++ b/mozilla/browser/components/places/src/nsAnnoProtocolHandler.h @@ -0,0 +1,68 @@ +//* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Annotation Service + * + * The Initial Developer of the Original Code is + * Google Inc. + * Portions created by the Initial Developer are Copyright (C) 2005 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brett Wilson (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsAnnoProtocolHandler_h___ +#define nsAnnoProtocolHandler_h___ + +#include "nsCOMPtr.h" +#include "nsIAnnotationService.h" +#include "nsIProtocolHandler.h" +#include "nsIURI.h" +#include "nsString.h" +#include "nsWeakReference.h" + +// {e8b8bdb7-c96c-4d82-9c6f-2b3c585ec7ea} +#define NS_ANNOPROTOCOLHANDLER_CID \ +{ 0xe8b8bdb7, 0xc96c, 0x4d82, { 0x9c, 0x6f, 0x2b, 0x3c, 0x58, 0x5e, 0xc7, 0xea } } + +class nsAnnoProtocolHandler : public nsIProtocolHandler, public nsSupportsWeakReference +{ +public: + nsAnnoProtocolHandler() {} + + NS_DECL_ISUPPORTS + NS_DECL_NSIPROTOCOLHANDLER + +private: + ~nsAnnoProtocolHandler() {} + +protected: + nsresult ParseAnnoURI(nsIURI* aURI, nsIURI** aResultURI, nsCString& aName); +}; + +#endif /* nsAnnoProtocolHandler_h___ */ diff --git a/mozilla/caps/src/nsScriptSecurityManager.cpp b/mozilla/caps/src/nsScriptSecurityManager.cpp index 998a3d4ef34..3547a80760e 100644 --- a/mozilla/caps/src/nsScriptSecurityManager.cpp +++ b/mozilla/caps/src/nsScriptSecurityManager.cpp @@ -1305,6 +1305,7 @@ nsScriptSecurityManager::CheckLoadURIWithPrincipal(nsIPrincipal* aPrincipal, { "chrome", ChromeProtocol }, { "file", PrefControlled }, { "https", AllowProtocol }, + { "moz-anno", ChromeProtocol }, { "mailbox", DenyProtocol }, { "pop", AllowProtocol }, { "imap", DenyProtocol },