[Libreoffice-commits] online.git: kit/Kit.cpp net/Socket.cpp net/Socket.hpp wsd/Admin.cpp wsd/Admin.hpp wsd/AdminModel.cpp wsd/AdminModel.hpp wsd/DocumentBroker.cpp wsd/LOOLWSD.cpp

Gabriel Masei (via logerrit) logerrit at kemper.freedesktop.org
Tue Apr 28 15:20:26 UTC 2020


 kit/Kit.cpp            |   22 ++--------------------
 net/Socket.cpp         |   15 +++++++++++----
 net/Socket.hpp         |    6 ++++--
 wsd/Admin.cpp          |   10 +++-------
 wsd/Admin.hpp          |    5 +++--
 wsd/AdminModel.cpp     |   11 +++--------
 wsd/AdminModel.hpp     |    5 +++--
 wsd/DocumentBroker.cpp |   15 ++-------------
 wsd/LOOLWSD.cpp        |    3 ++-
 9 files changed, 33 insertions(+), 59 deletions(-)

New commits:
commit d006204478cb4a10e35574f4c12a37318f7b39eb
Author:     Gabriel Masei <gabriel.masei at 1and1.ro>
AuthorDate: Tue Apr 28 16:55:47 2020 +0300
Commit:     Michael Meeks <michael.meeks at collabora.com>
CommitDate: Tue Apr 28 17:20:07 2020 +0200

    wsd: admin: send smaps fd along websocket upgrade request
    
    Change-Id: I2c5c23284b7578f4c177ec337cc1262bf1259e96
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/93074
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index ae775fee3..b5409ca68 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -649,9 +649,6 @@ public:
     }
 };
 
-#if !MOBILEAPP
-static int ProcSMapsFile = -1;
-#endif
 
 class ThreadPool {
     std::mutex _mutex;
@@ -795,22 +792,6 @@ public:
                 "] and id [" << _docId << "].");
         assert(_loKit);
 
-#if !MOBILEAPP
-        if (ProcSMapsFile >= 0)
-        {
-            static const std::string str = "smapsfd:";
-            if (websocketHandler->sendTextMessageWithFD(str.c_str(), str.size(), ProcSMapsFile) > 0)
-            {
-                LOG_DBG("Successfully sent smaps fd to wsd");
-                close(ProcSMapsFile);
-                ProcSMapsFile = -1;
-            }
-            else
-            {
-                LOG_ERR("Failed to send smaps fd to wsd");
-            }
-        }
-#endif
     }
 
     virtual ~Document()
@@ -2505,6 +2486,7 @@ void lokit_main(
 
     std::string userdir_url;
     std::string instdir_path;
+    int ProcSMapsFile = -1;
 
     // lokit's destroy typically throws from
     // framework/source/services/modulemanager.cxx:198
@@ -2749,7 +2731,7 @@ void lokit_main(
             std::make_shared<KitWebSocketHandler>("child_ws", loKit, jailId, mainKit);
 
 #if !MOBILEAPP
-        mainKit.insertNewUnixSocket(MasterLocation, pathAndQuery, websocketHandler);
+        mainKit.insertNewUnixSocket(MasterLocation, pathAndQuery, websocketHandler, ProcSMapsFile);
 #else
         mainKit.insertNewFakeSocket(docBrokerSocket, websocketHandler);
 #endif
diff --git a/net/Socket.cpp b/net/Socket.cpp
index 0b7a2f2ff..5e96ab2ac 100644
--- a/net/Socket.cpp
+++ b/net/Socket.cpp
@@ -407,7 +407,7 @@ void SocketPoll::insertNewWebSocketSync(
 // should this be a static method in the WebsocketHandler(?)
 void SocketPoll::clientRequestWebsocketUpgrade(const std::shared_ptr<StreamSocket>& socket,
                                                const std::shared_ptr<ProtocolHandlerInterface>& websocketHandler,
-                                               const std::string &pathAndQuery)
+                                               const std::string &pathAndQuery, const int shareFD)
 {
     // cf. WebSocketHandler::upgradeToWebSocket (?)
     // send Sec-WebSocket-Key: <hmm> ... Sec-WebSocket-Protocol: chat, Sec-WebSocket-Version: 13
@@ -426,14 +426,21 @@ void SocketPoll::clientRequestWebsocketUpgrade(const std::shared_ptr<StreamSocke
         "Sec-WebSocket-Version:13\r\n"
         "User-Agent: " WOPI_AGENT_STRING "\r\n"
         "\r\n";
-    socket->send(oss.str());
+    if (shareFD == -1)
+        socket->send(oss.str());
+    else
+    {
+        std::string request = oss.str();
+        socket->sendFD(request.c_str(), request.size(), shareFD);
+    }
     websocketHandler->onConnect(socket);
 }
 
 void SocketPoll::insertNewUnixSocket(
     const std::string &location,
     const std::string &pathAndQuery,
-    const std::shared_ptr<ProtocolHandlerInterface>& websocketHandler)
+    const std::shared_ptr<ProtocolHandlerInterface>& websocketHandler,
+    const int shareFD)
 {
     int fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
 
@@ -456,7 +463,7 @@ void SocketPoll::insertNewUnixSocket(
         if (socket)
         {
             LOG_DBG("Connected to local UDS " << location << " #" << socket->getFD());
-            clientRequestWebsocketUpgrade(socket, websocketHandler, pathAndQuery);
+            clientRequestWebsocketUpgrade(socket, websocketHandler, pathAndQuery, shareFD);
             insertNewSocket(socket);
         }
     }
diff --git a/net/Socket.hpp b/net/Socket.hpp
index ed59edb23..34da98aab 100644
--- a/net/Socket.hpp
+++ b/net/Socket.hpp
@@ -640,7 +640,8 @@ public:
     void insertNewUnixSocket(
         const std::string &location,
         const std::string &pathAndQuery,
-        const std::shared_ptr<ProtocolHandlerInterface>& websocketHandler);
+        const std::shared_ptr<ProtocolHandlerInterface>& websocketHandler,
+        const int shareFD = -1);
 #else
     void insertNewFakeSocket(
         int peerSocket,
@@ -698,9 +699,10 @@ protected:
 
 private:
     /// Generate the request to connect & upgrade this socket to a given path
+    /// and sends a file descriptor along request if is != -1.
     void clientRequestWebsocketUpgrade(const std::shared_ptr<StreamSocket>& socket,
                                        const std::shared_ptr<ProtocolHandlerInterface>& websocketHandler,
-                                       const std::string &pathAndQuery);
+                                       const std::string &pathAndQuery, const int shareFD = -1);
 
     /// Initialize the poll fds array with the right events
     void setupPollFds(std::chrono::steady_clock::time_point now,
diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index 0af46c8ad..ace0d6e5d 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -483,9 +483,10 @@ void Admin::modificationAlert(const std::string& dockey, Poco::Process::PID pid,
 }
 
 void Admin::addDoc(const std::string& docKey, Poco::Process::PID pid, const std::string& filename,
-        const std::string& sessionId, const std::string& userName, const std::string& userId)
+                   const std::string& sessionId, const std::string& userName, const std::string& userId,
+                   const int smapsFD)
 {
-    addCallback([=] { _model.addDocument(docKey, pid, filename, sessionId, userName, userId); });
+    addCallback([=] { _model.addDocument(docKey, pid, filename, sessionId, userName, userId, smapsFD); });
 }
 
 void Admin::rmDoc(const std::string& docKey, const std::string& sessionId)
@@ -593,11 +594,6 @@ void Admin::setDocWopiUploadDuration(const std::string& docKey, const std::chron
     addCallback([=]{ _model.setDocWopiUploadDuration(docKey, uploadDuration); });
 }
 
-void Admin::setDocProcSMapsFD(const std::string& docKey, const int smapsFD)
-{
-    addCallback([=]{ _model.setDocProcSMapsFD(docKey, smapsFD); });
-}
-
 void Admin::addSegFaultCount(unsigned segFaultCount)
 {
     addCallback([=]{ _model.addSegFaultCount(segFaultCount); });
diff --git a/wsd/Admin.hpp b/wsd/Admin.hpp
index 80364378d..3d9af9ef3 100644
--- a/wsd/Admin.hpp
+++ b/wsd/Admin.hpp
@@ -84,7 +84,9 @@ public:
     void update(const std::string& message);
 
     /// Calls with same pid will increment view count, if pid already exists
-    void addDoc(const std::string& docKey, Poco::Process::PID pid, const std::string& filename, const std::string& sessionId, const std::string& userName, const std::string& userId);
+    void addDoc(const std::string& docKey, Poco::Process::PID pid, const std::string& filename,
+                const std::string& sessionId, const std::string& userName, const std::string& userId,
+                const int smapsFD);
 
     /// Decrement view count till becomes zero after which doc is removed
     void rmDoc(const std::string& docKey, const std::string& sessionId);
@@ -129,7 +131,6 @@ public:
     void setViewLoadDuration(const std::string& docKey, const std::string& sessionId, std::chrono::milliseconds viewLoadDuration);
     void setDocWopiDownloadDuration(const std::string& docKey, std::chrono::milliseconds wopiDownloadDuration);
     void setDocWopiUploadDuration(const std::string& docKey, const std::chrono::milliseconds uploadDuration);
-    void setDocProcSMapsFD(const std::string& docKey, const int smapsFD);
     void addSegFaultCount(unsigned segFaultCount);
 
     void getMetrics(std::ostringstream &metrics);
diff --git a/wsd/AdminModel.cpp b/wsd/AdminModel.cpp
index 18ccb62f1..bebd00b7d 100644
--- a/wsd/AdminModel.cpp
+++ b/wsd/AdminModel.cpp
@@ -495,11 +495,13 @@ void AdminModel::modificationAlert(const std::string& docKey, Poco::Process::PID
 
 void AdminModel::addDocument(const std::string& docKey, Poco::Process::PID pid,
                              const std::string& filename, const std::string& sessionId,
-                             const std::string& userName, const std::string& userId)
+                             const std::string& userName, const std::string& userId,
+                             const int smapsFD)
 {
     assertCorrectThread();
 
     const auto ret = _documents.emplace(docKey, std::unique_ptr<Document>(new Document(docKey, pid, filename)));
+    ret.first->second->setProcSMapsFD(smapsFD);
     ret.first->second->takeSnapshot();
     ret.first->second->addView(sessionId, userName, userId);
     LOG_DBG("Added admin document [" << docKey << "].");
@@ -776,13 +778,6 @@ void AdminModel::setDocWopiUploadDuration(const std::string& docKey, const std::
         it->second->setWopiUploadDuration(wopiUploadDuration);
 }
 
-void AdminModel::setDocProcSMapsFD(const std::string& docKey, const int smapsFD)
-{
-    auto it = _documents.find(docKey);
-    if (it != _documents.end())
-        it->second->setProcSMapsFD(smapsFD);
-}
-
 void AdminModel::addSegFaultCount(unsigned segFaultCount)
 {
     _segFaultCount += segFaultCount;
diff --git a/wsd/AdminModel.hpp b/wsd/AdminModel.hpp
index 15afb344a..862b02b1b 100644
--- a/wsd/AdminModel.hpp
+++ b/wsd/AdminModel.hpp
@@ -311,7 +311,9 @@ public:
 
     void notify(const std::string& message);
 
-    void addDocument(const std::string& docKey, Poco::Process::PID pid, const std::string& filename, const std::string& sessionId, const std::string& userName, const std::string& userId);
+    void addDocument(const std::string& docKey, Poco::Process::PID pid, const std::string& filename,
+                     const std::string& sessionId, const std::string& userName, const std::string& userId,
+                     const int smapsFD);
 
     void removeDocument(const std::string& docKey, const std::string& sessionId);
     void removeDocument(const std::string& docKey);
@@ -331,7 +333,6 @@ public:
     void setViewLoadDuration(const std::string& docKey, const std::string& sessionId, std::chrono::milliseconds viewLoadDuration);
     void setDocWopiDownloadDuration(const std::string& docKey, std::chrono::milliseconds wopiDownloadDuration);
     void setDocWopiUploadDuration(const std::string& docKey, const std::chrono::milliseconds wopiUploadDuration);
-    void setDocProcSMapsFD(const std::string& docKey, const int smapsFD);
     void addSegFaultCount(unsigned segFaultCount);
     void setForKitPid(pid_t pid) { _forKitPid = pid; }
 
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index fd1dc7f46..b6defa9d5 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -1340,7 +1340,8 @@ size_t DocumentBroker::addSessionInternal(const std::shared_ptr<ClientSession>&
 
 #if !MOBILEAPP
     // Tell the admin console about this new doc
-    Admin::instance().addDoc(_docKey, getPid(), getFilename(), id, session->getUserName(), session->getUserId());
+    Admin::instance().addDoc(_docKey, getPid(), getFilename(), id, session->getUserName(),
+                             session->getUserId(), _childProcess->getSMapsFD());
     Admin::instance().setDocWopiDownloadDuration(_docKey, _wopiLoadDuration);
 #endif
 
@@ -1591,18 +1592,6 @@ bool DocumentBroker::handleInput(const std::vector<char>& payload)
             LOG_CHECK_RET(kind != "", false);
             Util::alertAllUsers(cmd, kind);
         }
-#if !MOBILEAPP
-        else if (command == "smapsfd:")
-        {
-            std::shared_ptr<StreamSocket> socket = std::static_pointer_cast<StreamSocket>(_childProcess->_socket);
-            if (socket)
-            {
-                _childProcess->setSMapsFD(socket->getIncomingFD());
-                Admin::instance().setDocProcSMapsFD(_docKey, _childProcess->getSMapsFD());
-                LOG_DBG("Received smaps fd");
-            }
-        }
-#endif
         else
         {
             LOG_ERR("Unexpected message: [" << msg << "].");
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 329051698..ba66a372d 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -2032,6 +2032,7 @@ private:
 
             auto child = std::make_shared<ChildProcess>(pid, jailId, socket, request);
 
+            child->setSMapsFD(socket->getIncomingFD());
             _childProcess = child; // weak
 
             // Remove from prisoner poll since there is no activity
@@ -2072,7 +2073,7 @@ private:
         if (docBroker)
             docBroker->handleInput(data);
         else
-            LOG_WRN("Child " << child->getPid() <<
+                LOG_WRN("Child " << child->getPid() <<
                     " has no DocumentBroker to handle message: [" << abbr << "].");
     }
 


More information about the Libreoffice-commits mailing list