[Libreoffice-commits] online.git: loolwsd/LOOLWSD.cpp loolwsd/Storage.cpp loolwsd/Storage.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Sat Apr 16 17:58:19 UTC 2016


 loolwsd/LOOLWSD.cpp |    2 ++
 loolwsd/Storage.cpp |   48 ++++++++++++++++++++++++++++++++++++++++++++----
 loolwsd/Storage.hpp |    9 +++++++++
 3 files changed, 55 insertions(+), 4 deletions(-)

New commits:
commit 115e654d6322d11b09ca2bb7405cfdbe1d81203c
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sat Apr 16 08:13:59 2016 -0400

    bccu#1648: Limit trusted WOPI hosts
    
    Control allowed/trusted wopi hosts from config.
    
    Change-Id: I730b4be8ef0d47bdb5e490926486184777de4eb0
    Reviewed-on: https://gerrit.libreoffice.org/24135
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 43c23a6..0a06948 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -1094,6 +1094,8 @@ void LOOLWSD::initialize(Application& self)
     // which forces admins to set this flag on the command-line.
     config().setBool("storage.filesystem[@allow]", AllowLocalStorage);
 
+    StorageBase::initialize();
+
     ServerApplication::initialize(self);
 }
 
diff --git a/loolwsd/Storage.cpp b/loolwsd/Storage.cpp
index 3929df6..1fb3bba 100644
--- a/loolwsd/Storage.cpp
+++ b/loolwsd/Storage.cpp
@@ -31,6 +31,10 @@
 ///////////////////
 // StorageBase Impl
 ///////////////////
+bool StorageBase::_filesystemEnabled;
+bool StorageBase::_wopiEnabled;
+std::vector<std::string> StorageBase::_wopiHosts;
+
 std::string StorageBase::getLocalRootPath() const
 {
     auto localPath = _jailPath;
@@ -52,15 +56,47 @@ size_t StorageBase::getFileSize(const std::string& filename)
     return std::ifstream(filename, std::ifstream::ate | std::ifstream::binary).tellg();
 }
 
+void StorageBase::initialize()
+{
+    const auto& app = Poco::Util::Application::instance();
+    _filesystemEnabled = app.config().getBool("storage.filesystem[@allow]", false);
+
+    // Parse the WOPI settings.
+    _wopiHosts.clear();
+    _wopiEnabled = app.config().getBool("storage.wopi[@allow]", false);
+    if (_wopiEnabled)
+    {
+        for (size_t i = 0; ; ++i)
+        {
+            const std::string path = "storage.wopi.host[" + std::to_string(i) + "]";
+            if (app.config().getBool(path + "[@allow]", false))
+            {
+                const auto host = app.config().getString(path, "");
+                if (!host.empty())
+                {
+                    Log::info("Adding trusted WOPI host: [" + host + "].");
+                    _wopiHosts.push_back(host);
+                }
+            }
+            else if (!app.config().has(path))
+            {
+                break;
+            }
+        }
+    }
+}
+
 std::unique_ptr<StorageBase> StorageBase::create(const std::string& jailRoot, const std::string& jailPath, const Poco::URI& uri)
 {
     std::unique_ptr<StorageBase> storage;
 
     if (UnitWSD::get().createStorage(jailRoot, jailPath, uri, storage))
-        Log::info("Storage load hooked");
+    {
+        Log::info("Storage load hooked.");
+    }
     else if (uri.isRelative() || uri.getScheme() == "file")
     {
-        if (!Poco::Util::Application::instance().config().getBool("storage.filesystem[@allow]", false))
+        if (!_filesystemEnabled)
         {
             Log::error("Local Storage is disabled by default. Specify allowlocalstorage on the command-line to enable.");
             return nullptr;
@@ -69,13 +105,17 @@ std::unique_ptr<StorageBase> StorageBase::create(const std::string& jailRoot, co
         Log::info("Public URI [" + uri.toString() + "] is a file.");
         storage = std::unique_ptr<StorageBase>(new LocalStorage(jailRoot, jailPath, uri.getPath()));
     }
-    else
+    else if (_wopiEnabled)
     {
         Log::info("Public URI [" + uri.toString() +
                   "] assuming cloud storage.");
-        //TODO: Configure the storage to use. For now, assume it's WOPI.
         storage = std::unique_ptr<StorageBase>(new WopiStorage(jailRoot, jailPath, uri.toString()));
     }
+    else
+    {
+        throw std::runtime_error("No Storage configured or invalid URI.");
+    }
+
     return storage;
 }
 
diff --git a/loolwsd/Storage.hpp b/loolwsd/Storage.hpp
index 29f0fc3..9855bbb 100644
--- a/loolwsd/Storage.hpp
+++ b/loolwsd/Storage.hpp
@@ -69,6 +69,10 @@ public:
     static
     size_t getFileSize(const std::string& filename);
 
+    /// Must be called at startup to configure.
+    static void initialize();
+
+    /// Storage object creation factory.
     static std::unique_ptr<StorageBase> create(const std::string& jailRoot,
                                                const std::string& jailPath,
                                                const Poco::URI& uri);
@@ -79,6 +83,11 @@ protected:
     const std::string _uri;
     std::string _jailedFilePath;
     FileInfo _fileInfo;
+
+    static bool _filesystemEnabled;
+    static bool _wopiEnabled;
+    /// Allowed/trusted WOPI hosts, if any and if WOPI is enabled.
+    static std::vector<std::string> _wopiHosts;
 };
 
 /// Trivial implementation of local storage that does not need do anything.


More information about the Libreoffice-commits mailing list