loolwsd/ChildProcessSession.cpp | 8 ++--- loolwsd/ChildProcessSession.hpp | 7 ++--- loolwsd/LOOLBroker.cpp | 26 +++++++++++-------- loolwsd/LOOLKit.cpp | 54 ++++++++++++++++++++-------------------- loolwsd/LOOLWSD.cpp | 6 ++-- loolwsd/LOOLWSD.hpp | 2 - loolwsd/Util.cpp | 28 ++++++++++++++++++++ loolwsd/Util.hpp | 5 +++ 8 files changed, 88 insertions(+), 48 deletions(-)
New commits: commit 0b5bc5f244dbdc73df708d9e92e00c1297a5bc71 Author: Ashod Nakashian <[email protected]> Date: Wed Jan 6 22:47:01 2016 -0500 loolwsd: random jailId dir created by WSD and renamed childId -> jailId Change-Id: Ib5ce65c578c0c7fd3dbf81628906cd17728fb3ff Reviewed-on: https://gerrit.libreoffice.org/21182 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp index 3267570..8434b61 100644 --- a/loolwsd/ChildProcessSession.cpp +++ b/loolwsd/ChildProcessSession.cpp @@ -45,13 +45,13 @@ ChildProcessSession::ChildProcessSession(const std::string& id, std::shared_ptr<Poco::Net::WebSocket> ws, LibreOfficeKit *loKit, LibreOfficeKitDocument * loKitDocument, - const std::string& childId, + const std::string& jailId, std::function<void(LibreOfficeKitDocument*, int)> onLoad, std::function<void(int)> onUnload) : LOOLSession(id, Kind::ToMaster, ws), _loKitDocument(loKitDocument), _loKit(loKit), - _childId(childId), + _jailId(jailId), _viewId(0), _clientPart(0), _onLoad(onLoad), @@ -528,14 +528,14 @@ bool ChildProcessSession::downloadAs(const char* /*buffer*/, int /*length*/, Str format.size() == 0 ? nullptr :format.c_str(), filterOptions.size() == 0 ? nullptr : filterOptions.c_str()); - sendTextFrame("downloadas: jail=" + _childId + " dir=" + tmpDir + " name=" + name + + sendTextFrame("downloadas: jail=" + _jailId + " dir=" + tmpDir + " name=" + name + " port=" + std::to_string(ClientPortNumber) + " id=" + id); return true; } bool ChildProcessSession::getChildId() { - sendTextFrame("getchildid: id=" + _childId); + sendTextFrame("getchildid: id=" + _jailId); return true; } diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp index dd8bd20..a24096e 100644 --- a/loolwsd/ChildProcessSession.hpp +++ b/loolwsd/ChildProcessSession.hpp @@ -27,12 +27,13 @@ public: /// loKit The LOKit instance. /// loKitDocument The instance to an existing document (when opening /// a new view) or nullptr (when first view). - /// childId The id of the lokit instance, used by downloadas to construct jailed path. + /// jailId The JailID of the jail root directory, + // used by downloadas to construct jailed path. ChildProcessSession(const std::string& id, std::shared_ptr<Poco::Net::WebSocket> ws, LibreOfficeKit *loKit, LibreOfficeKitDocument * loKitDocument, - const std::string& childId, + const std::string& jailId, std::function<void(LibreOfficeKitDocument*, int)> onLoad, std::function<void(int)> onUnload); virtual ~ChildProcessSession(); @@ -75,7 +76,7 @@ public: std::string _loSubPath; LibreOfficeKit *_loKit; - const std::string _childId; + const std::string _jailId; private: diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp index 12bde23..2ebbda8 100644 --- a/loolwsd/LOOLBroker.cpp +++ b/loolwsd/LOOLBroker.cpp @@ -431,7 +431,7 @@ static bool globalPreinit(const std::string &loSubPath) } static int createLibreOfficeKit(const bool sharePages, const std::string& loSubPath, - const std::string& childId) + const std::string& jailId) { Poco::UInt64 child; int nFIFOWriter = -1; @@ -452,7 +452,7 @@ static int createLibreOfficeKit(const bool sharePages, const std::string& loSubP if (!(pid = fork())) { // child - lokit_main(loSubPath, childId, pipe); + lokit_main(loSubPath, jailId, pipe); _exit(0); } else @@ -466,7 +466,7 @@ static int createLibreOfficeKit(const bool sharePages, const std::string& loSubP { Process::Args args; args.push_back("--losubpath=" + loSubPath); - args.push_back("--child=" + childId); + args.push_back("--jailid=" + jailId); args.push_back("--pipe=" + pipe); args.push_back("--clientport=" + std::to_string(ClientPortNumber)); @@ -501,14 +501,14 @@ static int createLibreOfficeKit(const bool sharePages, const std::string& loSubP } static int startupLibreOfficeKit(const bool sharePages, const int nLOKits, - const std::string& loSubPath, const std::string& childId) + const std::string& loSubPath, const std::string& jailId) { Process::PID pId = -1; Log::info() << "Starting " << nLOKits << " LoKit instaces." << Log::end; for (int nCntr = nLOKits; nCntr; nCntr--) { - if ((pId = createLibreOfficeKit(sharePages, loSubPath, childId)) < 0) + if ((pId = createLibreOfficeKit(sharePages, loSubPath, jailId)) < 0) { Log::error("Error: failed to create LibreOfficeKit."); break; @@ -537,6 +537,7 @@ int main(int argc, char** argv) #endif std::string childRoot; + std::string jailId; std::string loSubPath; std::string sysTemplate; std::string loTemplate; @@ -569,6 +570,12 @@ int main(int argc, char** argv) if (*eq) childRoot = std::string(++eq); } + else if (strstr(cmd, "--jailid=") == cmd) + { + eq = strchrnul(cmd, '='); + if (*eq) + jailId = std::string(++eq); + } else if (strstr(cmd, "--numprespawns=") == cmd) { eq = strchrnul(cmd, '='); @@ -645,10 +652,7 @@ int main(int argc, char** argv) exit(-1); } - //TODO: Why not use our PID? - const std::string childId = std::to_string(Util::rng::getNext()); - - const Path jailPath = Path::forDirectory(childRoot + Path::separator() + childId); + const Path jailPath = Path::forDirectory(childRoot + Path::separator() + jailId); Log::info("Jail path: " + jailPath.toString()); File(jailPath).createDirectories(); @@ -722,7 +726,7 @@ int main(int argc, char** argv) const bool sharePages = globalPreinit(loSubPath); - if ( startupLibreOfficeKit(sharePages, numPreSpawnedChildren, loSubPath, childId) < 0 ) + if ( startupLibreOfficeKit(sharePages, numPreSpawnedChildren, loSubPath, jailId) < 0 ) { Log::error("Error: failed to create children."); exit(-1); @@ -785,7 +789,7 @@ int main(int argc, char** argv) forkMutex.lock(); --forkCounter; - if (createLibreOfficeKit(sharePages, loSubPath, childId) < 0) + if (createLibreOfficeKit(sharePages, loSubPath, jailId) < 0) Log::error("Error: fork failed."); forkMutex.unlock(); diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 6c765ab..3f67652 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -320,23 +320,23 @@ class Connection: public Runnable { public: Connection(LibreOfficeKit *loKit, LibreOfficeKitDocument *loKitDocument, - const std::string& childId, const std::string& sessionId, + const std::string& jailId, const std::string& sessionId, std::function<void(LibreOfficeKitDocument*, int)> onLoad, std::function<void(int)> onUnload) : _loKit(loKit), _loKitDocument(loKitDocument), - _childId(childId), + _jailId(jailId), _sessionId(sessionId), _stop(false), _onLoad(onLoad), _onUnload(onUnload) { - Log::info("Connection ctor in child: " + childId + ", thread: " + _sessionId); + Log::info("Connection ctor in child: " + jailId + ", thread: " + _sessionId); } ~Connection() { - Log::info("~Connection dtor in child: " + _childId + ", thread: " + _sessionId); + Log::info("~Connection dtor in child: " + _jailId + ", thread: " + _sessionId); stop(); } @@ -387,11 +387,11 @@ public: HTTPResponse response; auto ws = std::make_shared<WebSocket>(cs, request, response); - _session.reset(new ChildProcessSession(_sessionId, ws, _loKit, _loKitDocument, _childId, _onLoad, _onUnload)); + _session.reset(new ChildProcessSession(_sessionId, ws, _loKit, _loKitDocument, _jailId, _onLoad, _onUnload)); ws->setReceiveTimeout(0); // child Jail TID PID - std::string hello("child " + _childId + " " + + std::string hello("child " + _jailId + " " + _sessionId + " " + std::to_string(Process::id())); _session->sendTextFrame(hello); @@ -451,7 +451,7 @@ public: private: LibreOfficeKit *_loKit; LibreOfficeKitDocument *_loKitDocument; - const std::string _childId; + const std::string _jailId; const std::string _sessionId; Thread _thread; std::shared_ptr<ChildProcessSession> _session; @@ -470,14 +470,14 @@ private: class Document { public: - Document(LibreOfficeKit *loKit, const std::string& childId, + Document(LibreOfficeKit *loKit, const std::string& jailId, const std::string& url) : _loKit(loKit), - _childId(childId), + _jailId(jailId), _url(url), _loKitDocument(nullptr) { - Log::info("Document ctor for url [" + url + "] on child [" + childId + "]."); + Log::info("Document ctor for url [" + url + "] on child [" + jailId + "]."); } ~Document() @@ -521,7 +521,7 @@ public: Log::warn("Thread [" + sessionId + "] is not running. Restoring."); _connections.erase(sessionId); - auto thread = std::make_shared<Connection>(_loKit, aItem->second->getLOKitDocument(), _childId, sessionId, + auto thread = std::make_shared<Connection>(_loKit, aItem->second->getLOKitDocument(), _jailId, sessionId, [this](LibreOfficeKitDocument *loKitDocument, const int viewId) { onLoad(loKitDocument, viewId); }, [this](const int viewId) { onUnload(viewId); }); _connections.emplace(sessionId, thread); @@ -535,16 +535,16 @@ public: std::shared_ptr<Connection> thread; if ( _connections.empty() ) { - Log::info("Creating main thread for child: " + _childId + ", thread: " + sessionId); - thread = std::make_shared<Connection>(_loKit, nullptr, _childId, sessionId, + Log::info("Creating main thread for child: " + _jailId + ", thread: " + sessionId); + thread = std::make_shared<Connection>(_loKit, nullptr, _jailId, sessionId, [this](LibreOfficeKitDocument *loKitDocument, const int viewId) { onLoad(loKitDocument, viewId); }, [this](const int viewId) { onUnload(viewId); }); } else { - Log::info("Creating view thread for child: " + _childId + ", thread: " + sessionId); + Log::info("Creating view thread for child: " + _jailId + ", thread: " + sessionId); auto aConnection = _connections.begin(); - thread = std::make_shared<Connection>(_loKit, aConnection->second->getLOKitDocument(), _childId, sessionId, + thread = std::make_shared<Connection>(_loKit, aConnection->second->getLOKitDocument(), _jailId, sessionId, [this](LibreOfficeKitDocument *loKitDocument, const int viewId) { onLoad(loKitDocument, viewId); }, [this](const int viewId) { onUnload(viewId); }); } @@ -554,7 +554,7 @@ public: if ( aInserted.second ) thread->start(); else - Log::error("Connection already exists for child: " + _childId + ", thread: " + sessionId); + Log::error("Connection already exists for child: " + _jailId + ", thread: " + sessionId); Log::debug("Connections: " + std::to_string(_connections.size())); } @@ -578,7 +578,7 @@ private: private: LibreOfficeKit *_loKit; - const std::string _childId; + const std::string _jailId; const std::string _url; LibreOfficeKitDocument *_loKitDocument; @@ -586,7 +586,7 @@ private: std::map<std::string, std::shared_ptr<Connection>> _connections; }; -void lokit_main(const std::string &loSubPath, const std::string& childId, const std::string& pipe) +void lokit_main(const std::string &loSubPath, const std::string& jailId, const std::string& pipe) { #ifdef LOOLKIT_NO_MAIN // Reinitialize logging when forked. @@ -601,7 +601,7 @@ void lokit_main(const std::string &loSubPath, const std::string& childId, const std::map<std::string, std::shared_ptr<Document>> _documents; - assert(!childId.empty()); + assert(!jailId.empty()); assert(!loSubPath.empty()); static const std::string process_name = "loolkit"; @@ -647,7 +647,7 @@ void lokit_main(const std::string &loSubPath, const std::string& childId, const CallBackWorker callbackWorker(ChildProcessSession::_callbackQueue); Poco::ThreadPool::defaultPool().start(callbackWorker); - Log::info("Child [" + childId + "] is ready."); + Log::info("Child [" + jailId + "] is ready."); std::string aResponse; std::string aMessage; @@ -723,7 +723,7 @@ void lokit_main(const std::string &loSubPath, const std::string& childId, const auto it = _documents.lower_bound(url); if (it == _documents.end()) - it = _documents.emplace_hint(it, url, std::make_shared<Document>(loKit.get(), childId, url)); + it = _documents.emplace_hint(it, url, std::make_shared<Document>(loKit.get(), jailId, url)); it->second->createSession(sessionId); } @@ -780,7 +780,7 @@ int main(int argc, char** argv) Log::initialize("kit"); std::string loSubPath; - std::string childId; + std::string jailId; std::string pipe; for (int i = 1; i < argc; ++i) @@ -793,11 +793,11 @@ int main(int argc, char** argv) if (*eq) loSubPath = std::string(++eq); } - else if (strstr(cmd, "--child=") == cmd) + else if (strstr(cmd, "--jailid=") == cmd) { eq = strchrnul(cmd, '='); if (*eq) - childId = std::string(++eq); + jailId = std::string(++eq); } else if (strstr(cmd, "--pipe=") == cmd) { @@ -819,9 +819,9 @@ int main(int argc, char** argv) exit(1); } - if ( childId.empty() ) + if (jailId.empty()) { - Log::error("Error: --child is 0"); + Log::error("Error: --jailid is empty"); exit(1); } @@ -849,7 +849,7 @@ int main(int argc, char** argv) Log::error(std::string("Exception: ") + exc.what()); } - lokit_main(loSubPath, childId, pipe); + lokit_main(loSubPath, jailId, pipe); return 0; } diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 81d1712..09b5a06 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -786,7 +786,7 @@ void LOOLWSD::displayHelp() helpFormatter.format(std::cout); } -bool LOOLWSD::createBroker() +bool LOOLWSD::createBroker(const std::string& jailId) { Process::Args args; @@ -794,6 +794,7 @@ bool LOOLWSD::createBroker() args.push_back("--systemplate=" + sysTemplate); args.push_back("--lotemplate=" + loTemplate); args.push_back("--childroot=" + childRoot); + args.push_back("--jailid=" + jailId); args.push_back("--numprespawns=" + std::to_string(NumPreSpawnedChildren)); args.push_back("--clientport=" + std::to_string(ClientPortNumber)); @@ -869,7 +870,8 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) NamedMutexLOOL.lock(); - if (!createBroker()) + const auto jailId = Util::createRandomDir(childRoot); + if (!createBroker(jailId)) { Log::error("Failed to spawn loolBroker."); return Application::EXIT_UNAVAILABLE; diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp index f03faed..653659d 100644 --- a/loolwsd/LOOLWSD.hpp +++ b/loolwsd/LOOLWSD.hpp @@ -74,7 +74,7 @@ private: int createComponent(); int createDesktop(); - bool createBroker(); + bool createBroker(const std::string& jailId); }; #endif diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index 81e3b7d..80f2f23 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -176,6 +176,34 @@ namespace Util return oss.str(); } + std::string createRandomDir(const std::string& path) + { + Poco::File(path).createDirectories(); + for (;;) + { + const auto name = Util::encodeId(rng::getNext()); + Poco::File dir(Poco::Path(path, name)); + if (dir.createDirectory()) + { + return name; + } + } + } + + std::string createRandomFile(const std::string& path) + { + Poco::File(path).createDirectories(); + for (;;) + { + const auto name = Util::encodeId(rng::getNext()); + Poco::File file(Poco::Path(path, name)); + if (file.createFile()) + { + return name; + } + } + } + bool windowingAvailable() { #ifdef __linux diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp index ac3d091..4eec373 100644 --- a/loolwsd/Util.hpp +++ b/loolwsd/Util.hpp @@ -32,6 +32,11 @@ namespace Util /// Encode an integral ID into a string, with padding support. std::string encodeId(const unsigned number, const int padding = 5); + /// Creates a randomly name directory within path and returns the name. + std::string createRandomDir(const std::string& path); + /// Creates a randomly name file within path and returns the name. + std::string createRandomFile(const std::string& path); + bool windowingAvailable(); // Sadly, older libpng headers don't use const for the pixmap pointer parameter to _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
