[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-4-0' - wsd/FileServer.cpp wsd/Storage.cpp

merttumer (via logerrit) logerrit at kemper.freedesktop.org
Wed Aug 28 12:15:17 UTC 2019


 wsd/FileServer.cpp |   18 +++++++++++++++++-
 wsd/Storage.cpp    |   23 ++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 2 deletions(-)

New commits:
commit 3ab7e500d83ed814a2d1ba1043df828b1b6c865f
Author:     merttumer <mert.tumer at collabora.com>
AuthorDate: Wed Aug 21 16:23:40 2019 +0300
Commit:     Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Aug 28 14:14:59 2019 +0200

    Added reuse cookie option for wopi client
    
    Signed-off-by: merttumer <mert.tumer at collabora.com>
    (cherry picked from commit 9b8aa96a18ce2eda11b5e51b2df5bb0d8cd822d2)
    
    Change-Id: I61577189f461ef94523af13b3734d84a20a11222
    Reviewed-on: https://gerrit.libreoffice.org/78194
    Reviewed-by: Andras Timar <andras.timar at collabora.com>
    Tested-by: Andras Timar <andras.timar at collabora.com>

diff --git a/wsd/FileServer.cpp b/wsd/FileServer.cpp
index 447a23a90..6ce5c7b67 100644
--- a/wsd/FileServer.cpp
+++ b/wsd/FileServer.cpp
@@ -569,7 +569,8 @@ constexpr char BRANDING_UNSUPPORTED[] = "branding-unsupported";
 
 void FileServerRequestHandler::preprocessFile(const HTTPRequest& request, Poco::MemoryInputStream& message, const std::shared_ptr<StreamSocket>& socket)
 {
-    const auto host = ((LOOLWSD::isSSLEnabled() || LOOLWSD::isSSLTermination()) ? "wss://" : "ws://") + (LOOLWSD::ServerName.empty() ? request.getHost() : LOOLWSD::ServerName);
+    const auto host = ((LOOLWSD::isSSLEnabled() || LOOLWSD::isSSLTermination()) ? "wss://" : "ws://")
+                    + (LOOLWSD::ServerName.empty() ? request.getHost() : LOOLWSD::ServerName);
     const Poco::URI::QueryParameters params = Poco::URI(request.getURI()).getQueryParameters();
 
     // Is this a file we read at startup - if not; its not for serving.
@@ -670,6 +671,20 @@ void FileServerRequestHandler::preprocessFile(const HTTPRequest& request, Poco::
         << "X-XSS-Protection: 1; mode=block\r\n"
         << "Referrer-Policy: no-referrer\r\n";
 
+        const std::string reuseCookie = form.get("reuse_cookies_for_storage", "");
+        if (reuseCookie == "true")
+        {
+            NameValueCollection cookies;
+            request.getCookies(cookies);
+            std::ostringstream cookieTokens;
+
+            for (auto it = cookies.begin(); it != cookies.end(); it++)
+            {
+                cookieTokens << (*it).first << "=" << (*it).second << (std::next(it) != cookies.end() ? ":" : "");
+            }
+            setenv("LOOL_REUSE_STORAGE_COOKIE", cookieTokens.str().c_str(), 1);
+        }
+
     // Document signing: if endpoint URL is configured, whitelist that for
     // iframe purposes.
     std::ostringstream cspOss;
@@ -720,6 +735,7 @@ void FileServerRequestHandler::preprocessFile(const HTTPRequest& request, Poco::
         LOG_TRC("Denied all frame ancestors");
         cspOss << "img-src 'self' data: none;";
     }
+
     cspOss << "\r\n";
     // Append CSP to response headers too
     oss << cspOss.str();
diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp
index 387a03b50..83466fde7 100644
--- a/wsd/Storage.cpp
+++ b/wsd/Storage.cpp
@@ -397,6 +397,25 @@ void addStorageDebugCookie(Poco::Net::HTTPRequest& request)
 #endif
 }
 
+void addStorageReuseCookie(Poco::Net::HTTPRequest& request)
+{
+    if (std::getenv("LOOL_REUSE_STORAGE_COOKIE"))
+    {
+        Poco::Net::NameValueCollection nvcCookies;
+        std::vector<std::string> cookies = LOOLProtocol::tokenize(std::string(std::getenv("LOOL_REUSE_STORAGE_COOKIE")), ':');
+        for (auto cookie : cookies)
+        {
+            std::vector<std::string> cookieTokens = LOOLProtocol::tokenize(cookie, '=');
+            if (cookieTokens.size() == 2)
+            {
+                nvcCookies.add(cookieTokens[0], cookieTokens[1]);
+                LOG_TRC("Added storage reuse cookie [" << cookieTokens[0] << "=" << cookieTokens[1] << "].");
+            }
+        }
+        request.setCookies(nvcCookies);
+    }
+}
+
 Poco::Timestamp iso8601ToTimestamp(const std::string& iso8601Time, const std::string& name)
 {
     Poco::Timestamp timestamp = Poco::Timestamp::fromEpochTime(0);
@@ -438,7 +457,7 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Au
         request.set("User-Agent", WOPI_AGENT_STRING);
         auth.authorizeRequest(request);
         addStorageDebugCookie(request);
-
+        addStorageReuseCookie(request);
         const auto startTime = std::chrono::steady_clock::now();
 
         std::unique_ptr<Poco::Net::HTTPClientSession> psession(getHTTPClientSession(uriObject));
@@ -645,6 +664,7 @@ std::string WopiStorage::loadStorageFileToLocal(const Authorization& auth)
         request.set("User-Agent", WOPI_AGENT_STRING);
         auth.authorizeRequest(request);
         addStorageDebugCookie(request);
+        addStorageReuseCookie(request);
         psession->sendRequest(request);
 
         Poco::Net::HTTPResponse response;
@@ -785,6 +805,7 @@ StorageBase::SaveResult WopiStorage::saveLocalFileToStorage(const Authorization&
         request.setContentType("application/octet-stream");
         request.setContentLength(size);
         addStorageDebugCookie(request);
+        addStorageReuseCookie(request);
         std::ostream& os = psession->sendRequest(request);
 
         std::ifstream ifs(filePath);


More information about the Libreoffice-commits mailing list