wsd/DocumentBroker.cpp |   29 ++++++++++++++++++++++++-----
 wsd/DocumentBroker.hpp |    3 +++
 wsd/LOOLWSD.cpp        |    3 ---
 3 files changed, 27 insertions(+), 8 deletions(-)

New commits:
commit e877adc84bc6f90bcfa52f9f63666358e6614885
Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk>
Date:   Mon May 22 15:04:35 2017 -0400

    wsd: don't stop doc on unauthorized loading
    
    When a client connects with expired/invalid
    access_token, the document should remain
    active for other/existing clients, if any.
    
    However, if no clients exists (i.e. the
    first client has invalid access_token),
    then the document should be unloaded and
    cleaned up.
    
    Change-Id: Iaad95a4286325cc6ee130b37e3ad635993a71c72
    Reviewed-on: https://gerrit.libreoffice.org/37916
    Reviewed-by: Ashod Nakashian <ashnak...@gmail.com>
    Tested-by: Ashod Nakashian <ashnak...@gmail.com>

diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 73178103..17ce1be2 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -785,6 +785,25 @@ std::string DocumentBroker::getJailRoot() const
 
 size_t DocumentBroker::addSession(const std::shared_ptr<ClientSession>& 
session)
 {
+    try
+    {
+        return addSessionInternal(session);
+    }
+    catch (const std::exception& exc)
+    {
+        LOG_ERR("Failed to add session to [" << _docKey << "] with URI [" << 
session->getPublicUri().toString() << "]: " << exc.what());
+        if (_sessions.empty())
+        {
+            LOG_INF("Doc [" << _docKey << "] has no more sessions. Marking to 
destroy.");
+            _markToDestroy = true;
+        }
+
+        throw;
+    }
+}
+
+size_t DocumentBroker::addSessionInternal(const 
std::shared_ptr<ClientSession>& session)
+{
     assertCorrectThread();
 
     try
@@ -815,12 +834,7 @@ size_t DocumentBroker::addSession(const 
std::shared_ptr<ClientSession>& session)
     _markToDestroy = false;
     _stop = false;
 
-    // Add and attach the session.
-    _sessions.emplace(session->getId(), session);
-    session->setAttached();
-
     const auto id = session->getId();
-    const auto count = _sessions.size();
 
     // Request a new session from the child kit.
     const std::string aMessage = "session " + id + ' ' + _docKey + ' ' + 
_docId;
@@ -829,6 +843,11 @@ size_t DocumentBroker::addSession(const 
std::shared_ptr<ClientSession>& session)
     // Tell the admin console about this new doc
     Admin::instance().addDoc(_docKey, getPid(), getFilename(), id, 
session->getUserName());
 
+    // Add and attach the session.
+    _sessions.emplace(session->getId(), session);
+    session->setAttached();
+
+    const auto count = _sessions.size();
     LOG_TRC("Added " << (session->isReadOnly() ? "readonly" : "non-readonly") 
<<
             " session [" << id << "] to docKey [" <<
             _docKey << "] to have " << count << " sessions.");
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index 14fe17e0..23b699e4 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -350,6 +350,9 @@ private:
     /// Saves the doc to the storage.
     bool saveToStorageInternal(const std::string& sesionId, bool success, 
const std::string& result = "");
 
+    /// Loads a new session and adds to the sessions container.
+    size_t addSessionInternal(const std::shared_ptr<ClientSession>& session);
+
     /// Removes a session by ID. Returns the new number of sessions.
     size_t removeSessionInternal(const std::string& id);
 
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 3a877242..7c188f17 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -2127,19 +2127,16 @@ private:
                                 LOG_ERR("Unauthorized Request while loading 
session for " << docBroker->getDocKey() << ": " << exc.what());
                                 const std::string msg = "error: cmd=internal 
kind=unauthorized";
                                 clientSession->sendMessage(msg);
-                                docBroker->stop();
                             }
                             catch (const StorageConnectionException& exc)
                             {
                                 // Alert user about failed load
                                 const std::string msg = "error: cmd=storage 
kind=loadfailed";
                                 clientSession->sendMessage(msg);
-                                docBroker->stop();
                             }
                             catch (const std::exception& exc)
                             {
                                 LOG_ERR("Error while loading : " << 
exc.what());
-                                docBroker->stop();
                             }
                         });
                     });
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to