diff --git a/mozilla/extensions/xforms/Makefile.in b/mozilla/extensions/xforms/Makefile.in index 20fc57fdb73..9dd17fd07e3 100644 --- a/mozilla/extensions/xforms/Makefile.in +++ b/mozilla/extensions/xforms/Makefile.in @@ -70,6 +70,7 @@ REQUIRES = \ transformiix \ schemavalidation \ intl \ + pref \ $(NULL) XPIDLSRCS = \ diff --git a/mozilla/extensions/xforms/jar.mn b/mozilla/extensions/xforms/jar.mn index 1fd9945ba1b..a7725880bf8 100755 --- a/mozilla/extensions/xforms/jar.mn +++ b/mozilla/extensions/xforms/jar.mn @@ -1,6 +1,14 @@ xforms.jar: - content/xforms/contents.rdf - content/xforms/xforms.xml -* content/xforms/xforms.css +% overlay chrome://browser/content/preferences/preferences.xul chrome://xforms/content/xforms-prefs.xul +% content xforms %content/xforms/ +% locale xforms en-US %locale/en-US/xforms/ + content/xforms/contents.rdf (resources/content/contents.rdf) +* content/xforms/xforms.css (resources/content/xforms.css) +* content/xforms/xforms-prefs.xul (resources/content/xforms-prefs.xul) +* content/xforms/xforms-prefs-ui.xul (resources/content/xforms-prefs-ui.xul) +* content/xforms/xforms-prefs.js (resources/content/xforms-prefs.js) + content/xforms/xforms.xml (resources/content/xforms.xml) * locale/en-US/xforms/contents.rdf (resources/locale/en-US/contents.rdf) locale/en-US/xforms/xforms.properties (resources/locale/en-US/xforms.properties) + locale/en-US/xforms/xforms.dtd (resources/locale/en-US/xforms.dtd) + diff --git a/mozilla/extensions/xforms/nsXFormsSubmissionElement.cpp b/mozilla/extensions/xforms/nsXFormsSubmissionElement.cpp index d9b35b71cf0..449ee89a2ca 100644 --- a/mozilla/extensions/xforms/nsXFormsSubmissionElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsSubmissionElement.cpp @@ -89,6 +89,9 @@ #include "nsNetUtil.h" #include "nsXFormsUtils.h" #include "nsIDOMNamedNodeMap.h" +#include "nsIPermissionManager.h" +#include "nsIPrefBranch.h" +#include "nsIPrefService.h" // namespace literals #define NAMESPACE_XML_SCHEMA \ @@ -811,20 +814,70 @@ nsXFormsSubmissionElement::SerializeDataXML(nsIDOMNode *data, PRBool nsXFormsSubmissionElement::CheckSameOrigin(nsIURI *aBaseURI, nsIURI *aTestURI) { + PRBool result = PR_TRUE; + // We require same-origin for replace="instance" or XML submission if (mFormat & (ENCODING_XML | ENCODING_MULTIPART_RELATED) || mIsReplaceInstance) { - // if we don't replace the instance, we allow file:// to send the data - PRBool schemeIsFile = PR_FALSE; - + // if we don't replace the instance, we allow file:// or sites whitelisted + // to submit data if (!mIsReplaceInstance) { - aBaseURI->SchemeIs("file", &schemeIsFile); + aBaseURI->SchemeIs("file", &result); + + // lets check the permission manager + if (!result) { + result = CheckPermissionManager(aBaseURI); + } } - if (!schemeIsFile) - return nsXFormsUtils::CheckSameOrigin(aBaseURI, aTestURI); + if (!result) { + result = nsXFormsUtils::CheckSameOrigin(aBaseURI, aTestURI); + } } - return PR_TRUE; + + return result; +} + +PRBool +nsXFormsSubmissionElement::CheckPermissionManager(nsIURI *aBaseURI) +{ + PRBool result = PR_FALSE; + + nsresult rv; + nsCOMPtr prefBranch = + do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); + + PRUint32 permission = nsIPermissionManager::UNKNOWN_ACTION; + + if (NS_SUCCEEDED(rv) && prefBranch) { + // check if the user has enabled the xforms cross domain preference + PRBool checkPermission = PR_FALSE; + prefBranch->GetBoolPref("xforms.crossdomain.enabled", &checkPermission); + + if (checkPermission) { + // if the user enabled the cross domain check, query the permission + // manager with the URI. It will return 1 if the URI was allowed by the + // user. + nsCOMPtr permissionManager = + do_GetService("@mozilla.org/permissionmanager;1"); + + nsCOMPtr domDoc; + mElement->GetOwnerDocument(getter_AddRefs(domDoc)); + + nsCOMPtr doc = do_QueryInterface(domDoc); + NS_ENSURE_STATE(doc); + + permissionManager->TestPermission(doc->GetDocumentURI(), + "xforms-xd", &permission); + } + } + + if (permission == nsIPermissionManager::ALLOW_ACTION) { + // not in the permission manager + result = PR_TRUE; + } + + return result; } nsresult diff --git a/mozilla/extensions/xforms/nsXFormsSubmissionElement.h b/mozilla/extensions/xforms/nsXFormsSubmissionElement.h index 670b8e09302..1ebb1156135 100644 --- a/mozilla/extensions/xforms/nsXFormsSubmissionElement.h +++ b/mozilla/extensions/xforms/nsXFormsSubmissionElement.h @@ -126,6 +126,7 @@ private: * there is no need for a same origin check. */ PRBool CheckSameOrigin(nsIURI *aBaseURI, nsIURI *aTestURI); + PRBool CheckPermissionManager(nsIURI *aBaseURI); nsresult AddNameSpaces(nsIDOMElement* aTarget, nsIDOMNode* aSource); }; diff --git a/mozilla/extensions/xforms/package/Makefile.in b/mozilla/extensions/xforms/package/Makefile.in index b7dca6178e6..76dbe78f234 100755 --- a/mozilla/extensions/xforms/package/Makefile.in +++ b/mozilla/extensions/xforms/package/Makefile.in @@ -69,6 +69,7 @@ xpi: $(NSINSTALL) -D stage $(PERL) $(topsrcdir)/xpinstall/packager/pkgcp.pl -o $(PKGCP_PLATFORM) -s $(DIST)/bin -d stage -f $(srcdir)/$(PACKAGE_FILE) -v $(NSINSTALL) $(srcdir)/install.rdf stage/xforms + $(NSINSTALL) $(srcdir)/chrome.manifest stage/xforms @echo Creating install.js... rm -f xforms.js $(PERL) $(topsrcdir)/toolkit/mozapps/installer/makejs.pl $(srcdir)/xforms.jst $(PACKAGE_VERSION) stage/xforms diff --git a/mozilla/extensions/xforms/package/chrome.manifest b/mozilla/extensions/xforms/package/chrome.manifest new file mode 100644 index 00000000000..4e2dd8dc55f --- /dev/null +++ b/mozilla/extensions/xforms/package/chrome.manifest @@ -0,0 +1,4 @@ +overlay chrome://browser/content/preferences/preferences.xul chrome://xforms/content/xforms-prefs.xul + +content xforms jar:chrome/xforms.jar!/content/xforms/ +locale xforms en-US jar:chrome/xforms.jar!/locale/en-US/xforms/ diff --git a/mozilla/extensions/xforms/resources/content/contents.rdf b/mozilla/extensions/xforms/resources/content/contents.rdf new file mode 100755 index 00000000000..1c9b2bd0404 --- /dev/null +++ b/mozilla/extensions/xforms/resources/content/contents.rdf @@ -0,0 +1,49 @@ + + + + + + + + + + + + + diff --git a/mozilla/extensions/xforms/resources/content/xforms-prefs-ui.xul b/mozilla/extensions/xforms/resources/content/xforms-prefs-ui.xul new file mode 100644 index 00000000000..e5fe024f7e1 --- /dev/null +++ b/mozilla/extensions/xforms/resources/content/xforms-prefs-ui.xul @@ -0,0 +1,74 @@ + + + + + + %xformsDTD; + %contentDTD; +]> + + + + + + + + + + + + + + + + + +