b1bd9f
From 143eedd298113bb20c2807baa49a4c83c2cef70b Mon Sep 17 00:00:00 2001
b1bd9f
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
b1bd9f
Date: Fri, 26 Jul 2019 13:25:31 +0100
b1bd9f
Subject: [PATCH 1/3] decode url escape codes and check each path segment
b1bd9f
b1bd9f
Change-Id: Ie8f7cef912e8dacbc2a0bca73534a7a242a53ca1
b1bd9f
Reviewed-on: https://gerrit.libreoffice.org/76378
b1bd9f
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
b1bd9f
Tested-by: Jenkins
b1bd9f
(cherry picked from commit 7942929685fafb0f9c82feb8da7279e5103c87f0)
b1bd9f
Reviewed-on: https://gerrit.libreoffice.org/76451
b1bd9f
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
b1bd9f
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
b1bd9f
---
b1bd9f
 sfx2/source/doc/objmisc.cxx | 30 +++++++++++++++++++++++++++++-
b1bd9f
 1 file changed, 29 insertions(+), 1 deletion(-)
b1bd9f
b1bd9f
diff --git a/sfx2/source/doc/objmisc.cxx b/sfx2/source/doc/objmisc.cxx
b1bd9f
index 8594e9522e48..7e9288524b34 100644
b1bd9f
--- a/sfx2/source/doc/objmisc.cxx
b1bd9f
+++ b/sfx2/source/doc/objmisc.cxx
b1bd9f
@@ -41,6 +41,8 @@
b1bd9f
 #include <com/sun/star/script/provider/XScriptProvider.hpp>
b1bd9f
 #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
b1bd9f
 #include <com/sun/star/ucb/SimpleFileAccess.hpp>
b1bd9f
+#include <com/sun/star/uri/UriReferenceFactory.hpp>
b1bd9f
+#include <com/sun/star/uri/XVndSunStarScriptUrlReference.hpp>
b1bd9f
 #include <com/sun/star/util/XModifiable.hpp>
b1bd9f
 
b1bd9f
 #include <toolkit/helper/vclunohelper.hxx>
b1bd9f
@@ -1351,7 +1353,33 @@ namespace {
b1bd9f
 // don't allow LibreLogo to be used with our mouseover/etc dom-alike events
b1bd9f
 bool UnTrustedScript(const OUString& rScriptURL)
b1bd9f
 {
b1bd9f
-    return rScriptURL.startsWithIgnoreAsciiCase("vnd.sun.star.script:LibreLogo");
b1bd9f
+    if (!rScriptURL.startsWith("vnd.sun.star.script:"))
b1bd9f
+        return false;
b1bd9f
+
b1bd9f
+    // ensure URL Escape Codes are decoded
b1bd9f
+    css::uno::Reference<css::uri::XUriReference> uri(
b1bd9f
+        css::uri::UriReferenceFactory::create(comphelper::getProcessComponentContext())->parse(rScriptURL));
b1bd9f
+    css::uno::Reference<css::uri::XVndSunStarScriptUrl> sfUri(uri, css::uno::UNO_QUERY);
b1bd9f
+
b1bd9f
+    if (!sfUri.is())
b1bd9f
+        return false;
b1bd9f
+
b1bd9f
+    // pyuno encodes path separator as |
b1bd9f
+    OUString sScript = sfUri->getName().replace('|', '/');
b1bd9f
+
b1bd9f
+    // check if any path portion matches LibreLogo and ban it if it does
b1bd9f
+    sal_Int32 nIndex = 0;
b1bd9f
+    do
b1bd9f
+    {
b1bd9f
+        OUString aToken = sScript.getToken(0, '/', nIndex);
b1bd9f
+        if (aToken.startsWithIgnoreAsciiCase("LibreLogo"))
b1bd9f
+        {
b1bd9f
+            return true;
b1bd9f
+        }
b1bd9f
+    }
b1bd9f
+    while (nIndex >= 0);
b1bd9f
+
b1bd9f
+    return false;
b1bd9f
 }
b1bd9f
 
b1bd9f
 }
b1bd9f
-- 
b1bd9f
2.21.0
b1bd9f