[Libreoffice-commits] online.git: test/Makefile.am test/UnitWOPILoadEncoded.cpp test/WopiTestServer.hpp wsd/DocumentBroker.cpp

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Fri May 24 06:57:53 UTC 2019


 test/Makefile.am             |    8 +++-
 test/UnitWOPILoadEncoded.cpp |   71 +++++++++++++++++++++++++++++++++++++++++++
 test/WopiTestServer.hpp      |   13 ++++---
 wsd/DocumentBroker.cpp       |    7 +++-
 4 files changed, 91 insertions(+), 8 deletions(-)

New commits:
commit 898c47fbb42b6093c6d31bdd08c605f9b0bc0de2
Author:     Henry Castro <hcastro at collabora.com>
AuthorDate: Wed May 15 22:14:29 2019 -0400
Commit:     Andras Timar <andras.timar at collabora.com>
CommitDate: Fri May 24 08:57:36 2019 +0200

    wsd: fix the exception "Bad URI syntax"
    
    if the file name has '%' character it throws
    exception "Bad URI syntax", so use the encoded
    file name string
    
    Change-Id: I6a8d841761b46ac49a6c79956ba215e1affa53e5
    Reviewed-on: https://gerrit.libreoffice.org/72385
    Reviewed-by: Andras Timar <andras.timar at collabora.com>
    Tested-by: Andras Timar <andras.timar at collabora.com>
    (cherry picked from commit b934c70f4f1f9f3ee4f873570633a3b1ec931652)
    Reviewed-on: https://gerrit.libreoffice.org/72890

diff --git a/test/Makefile.am b/test/Makefile.am
index eed2abd5d..f1f43aee9 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -20,7 +20,8 @@ noinst_LTLIBRARIES = \
 	unit-fuzz.la unit-oob.la unit-http.la unit-oauth.la \
 	unit-wopi.la unit-wopi-saveas.la \
 	unit-wopi-ownertermination.la unit-wopi-versionrestore.la \
-	unit-wopi-documentconflict.la unit_wopi_renamefile.la
+	unit-wopi-documentconflict.la unit_wopi_renamefile.la \
+	unit-wopi-loadencoded.la
 
 
 MAGIC_TO_FORCE_SHLIB_CREATION = -rpath /dummy
@@ -113,6 +114,8 @@ unit_wopi_documentconflict_la_SOURCES = UnitWOPIDocumentConflict.cpp
 unit_wopi_documentconflict_la_LIBADD = $(CPPUNIT_LIBS)
 unit_wopi_renamefile_la_SOURCES = UnitWOPIRenameFile.cpp
 unit_wopi_renamefile_la_LIBADD = $(CPPUNIT_LIBS)
+unit_wopi_loadencoded_la_SOURCES = UnitWOPILoadEncoded.cpp
+unit_wopi_loadencoded_la_LIBADD = $(CPPUNIT_LIBS)
 
 if HAVE_LO_PATH
 SYSTEM_STAMP = @SYSTEMPLATE_PATH@/system_stamp
@@ -132,7 +135,8 @@ TESTS = unit-typing.la unit-convert.la unit-prefork.la unit-tilecache.la \
 	unit-timeout.la unit-oauth.la unit-wopi.la unit-wopi-saveas.la \
         unit-wopi-ownertermination.la unit-wopi-versionrestore.la \
         unit-wopi-documentconflict.la unit_wopi_renamefile.la \
-	unit-http.la
+	unit-http.la \
+	unit-wopi-loadencoded.la
 # TESTS = unit-client.la
 # TESTS += unit-admin.la
 # TESTS += unit-storage.la
diff --git a/test/UnitWOPILoadEncoded.cpp b/test/UnitWOPILoadEncoded.cpp
new file mode 100644
index 000000000..8a0bb3ebd
--- /dev/null
+++ b/test/UnitWOPILoadEncoded.cpp
@@ -0,0 +1,71 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <config.h>
+
+#include <WopiTestServer.hpp>
+#include <Log.hpp>
+#include <Unit.hpp>
+#include <UnitHTTP.hpp>
+#include <helpers.hpp>
+#include <Poco/Net/HTTPRequest.h>
+#include <Poco/Util/LayeredConfiguration.h>
+
+class UnitWOPILoadEncoded : public WopiTestServer
+{
+    enum class Phase
+    {
+        LoadEncoded,
+        CloseDoc,
+        Polling
+    } _phase;
+
+public:
+    UnitWOPILoadEncoded() :
+        _phase(Phase::LoadEncoded)
+    {
+    }
+
+    void invokeTest() override
+    {
+        constexpr char testName[] = "UnitWOPILoadEncoded";
+
+        switch (_phase)
+        {
+            case Phase::LoadEncoded:
+            {
+                initWebsocket("/wopi/files/3?access_token=anything");
+
+                helpers::sendTextFrame(*_ws->getLOOLWebSocket(), "load url=" + _wopiSrc, testName);
+                SocketPoll::wakeupWorld();
+
+                _phase = Phase::CloseDoc;
+                break;
+            }
+            case Phase::CloseDoc:
+            {
+                helpers::sendTextFrame(*_ws->getLOOLWebSocket(), "closedocument", testName);
+                _phase = Phase::Polling;
+                break;
+            }
+            case Phase::Polling:
+            {
+                exitTest(TestResult::Ok);
+                break;
+            }
+        }
+    }
+};
+
+UnitBase *unit_create_wsd(void)
+{
+    return new UnitWOPILoadEncoded();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/test/WopiTestServer.hpp b/test/WopiTestServer.hpp
index 8d5fb4bdf..5d64e7911 100644
--- a/test/WopiTestServer.hpp
+++ b/test/WopiTestServer.hpp
@@ -102,18 +102,21 @@ protected:
     virtual bool handleHttpRequest(const Poco::Net::HTTPRequest& request, Poco::MemoryInputStream& message, std::shared_ptr<StreamSocket>& socket) override
     {
         Poco::URI uriReq(request.getURI());
+        Poco::RegularExpression regInfo("/wopi/files/[0-9]");
+        Poco::RegularExpression regContent("/wopi/files/[0-9]/contents");
         LOG_INF("Fake wopi host request: " << uriReq.toString());
 
         // CheckFileInfo
-        if (request.getMethod() == "GET" && (uriReq.getPath() == "/wopi/files/0" || uriReq.getPath() == "/wopi/files/1"))
+        if (request.getMethod() == "GET" && regInfo.match(uriReq.getPath()))
         {
             LOG_INF("Fake wopi host request, handling CheckFileInfo: " << uriReq.getPath());
 
             assertCheckFileInfoRequest(request);
 
             Poco::LocalDateTime now;
+            const std::string fileName(uriReq.getPath() == "/wopi/files/3" ? "he%llo.txt" : "hello.txt");
             Poco::JSON::Object::Ptr fileInfo = new Poco::JSON::Object();
-            fileInfo->set("BaseFileName", "hello.txt");
+            fileInfo->set("BaseFileName", fileName);
             fileInfo->set("Size", _fileContent.size());
             fileInfo->set("Version", "1.0");
             fileInfo->set("OwnerId", "test");
@@ -145,7 +148,7 @@ protected:
             return true;
         }
         // GetFile
-        else if (request.getMethod() == "GET" && (uriReq.getPath() == "/wopi/files/0/contents" || uriReq.getPath() == "/wopi/files/1/contents"))
+        else if (request.getMethod() == "GET" && regContent.match(uriReq.getPath()))
         {
             LOG_INF("Fake wopi host request, handling GetFile: " << uriReq.getPath());
 
@@ -167,7 +170,7 @@ protected:
 
             return true;
         }
-        else if (request.getMethod() == "POST" && (uriReq.getPath() == "/wopi/files/0" || uriReq.getPath() == "/wopi/files/1"))
+        else if (request.getMethod() == "POST" && regInfo.match(uriReq.getPath()))
         {
             LOG_INF("Fake wopi host request, handling PutRelativeFile: " << uriReq.getPath());
             std::string wopiURL = helpers::getTestServerURI() + "/something wopi/files/1?access_token=anything";
@@ -201,7 +204,7 @@ protected:
 
             return true;
         }
-        else if (request.getMethod() == "POST" && (uriReq.getPath() == "/wopi/files/0/contents" || uriReq.getPath() == "/wopi/files/1/contents"))
+        else if (request.getMethod() == "POST" && regContent.match(uriReq.getPath()))
         {
             LOG_INF("Fake wopi host request, handling PutFile: " << uriReq.getPath());
 
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index eb8fb1eee..30f0619c6 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -742,7 +742,7 @@ bool DocumentBroker::load(const std::shared_ptr<ClientSession>& session, const s
         std::string localPathEncoded;
         Poco::URI::encode(localPath, "#", localPathEncoded);
         _uriJailed = Poco::URI(Poco::URI("file://"), localPathEncoded).toString();
-        _uriJailedAnonym = Poco::URI(Poco::URI("file://"), LOOLWSD::anonymizeUrl(localPath)).toString();
+        _uriJailedAnonym = Poco::URI(Poco::URI("file://"), LOOLWSD::anonymizeUrl(localPathEncoded)).toString();
 
         _filename = fileInfo.getFilename();
 
@@ -1167,6 +1167,11 @@ size_t DocumentBroker::addSessionInternal(const std::shared_ptr<ClientSession>&
         alertAllUsers("internal", "diskfull");
         throw;
     }
+    catch (const std::exception& exc)
+    {
+        LOG_ERR("loading document exception: " << exc.what());
+        throw;
+    }
 
     const std::string id = session->getId();
 


More information about the Libreoffice-commits mailing list