Makefile.am | 2 wsd/ClientSession.cpp | 1 wsd/ClientSession.hpp | 1 wsd/DocumentBroker.cpp | 1 wsd/LOOLWSD.cpp | 1 wsd/PrisonerSession.cpp | 285 ------------------------------------------------ wsd/PrisonerSession.hpp | 47 ------- 7 files changed, 338 deletions(-)
New commits: commit c789fe901ba86f9794eb255dfba210f5b3c87659 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Sat Jan 21 21:41:05 2017 -0500 wsd: kill PrisonerSession Change-Id: I7041f79038c377b107b46285278b70236b87f6ac Reviewed-on: https://gerrit.libreoffice.org/33434 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/Makefile.am b/Makefile.am index 79120bc..0ddcc7b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -52,7 +52,6 @@ loolwsd_SOURCES = wsd/Admin.cpp \ wsd/LOOLWSD.cpp \ wsd/ClientSession.cpp \ wsd/FileServer.cpp \ - wsd/PrisonerSession.cpp \ wsd/Storage.cpp \ wsd/TileCache.cpp \ $(shared_sources) @@ -100,7 +99,6 @@ wsd_headers = wsd/Admin.hpp \ wsd/FileServer.hpp \ wsd/LOOLWebSocket.hpp \ wsd/LOOLWSD.hpp \ - wsd/PrisonerSession.hpp \ wsd/QueueHandler.hpp \ wsd/SenderQueue.hpp \ wsd/Storage.hpp \ diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index d36705c..87bc072 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -18,7 +18,6 @@ #include "DocumentBroker.hpp" #include "LOOLWSD.hpp" #include "Log.hpp" -#include "PrisonerSession.hpp" #include "Protocol.hpp" #include "Session.hpp" #include "Util.hpp" diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp index e53a414..96fd0f7 100644 --- a/wsd/ClientSession.hpp +++ b/wsd/ClientSession.hpp @@ -18,7 +18,6 @@ #include <Poco/URI.h> class DocumentBroker; -class PrisonerSession; /// Represents a session to a LOOL client, in the WSD process. class ClientSession final : public Session, public std::enable_shared_from_this<ClientSession> diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index 38d13c1..fb19ca4 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -29,7 +29,6 @@ #include "Protocol.hpp" #include "LOOLWSD.hpp" #include "Log.hpp" -#include "PrisonerSession.hpp" #include "Storage.hpp" #include "TileCache.hpp" #include "SenderQueue.hpp" diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index 10bc54d..72dc826 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -105,7 +105,6 @@ #include "FileServer.hpp" #include "IoUtil.hpp" #include "Log.hpp" -#include "PrisonerSession.hpp" #include "Protocol.hpp" #include "QueueHandler.hpp" #include "Session.hpp" diff --git a/wsd/PrisonerSession.cpp b/wsd/PrisonerSession.cpp deleted file mode 100644 index c4188d9..0000000 --- a/wsd/PrisonerSession.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#include "PrisonerSession.hpp" -#include "config.h" - -#include <Poco/JSON/Object.h> -#include <Poco/JSON/Parser.h> - -#include "Common.hpp" -#include "DocumentBroker.hpp" -#include "Protocol.hpp" -#include "Session.hpp" -#include "LOOLWSD.hpp" -#include "Log.hpp" -#include "ClientSession.hpp" -#include "Rectangle.hpp" -#include "SenderQueue.hpp" -#include "Storage.hpp" -#include "TileCache.hpp" -#include "IoUtil.hpp" -#include "Util.hpp" - -using namespace LOOLProtocol; - -using Poco::Path; -using Poco::StringTokenizer; - -PrisonerSession::PrisonerSession(ClientSession& clientSession, - std::shared_ptr<DocumentBroker> docBroker) : - Session("ToPrisoner-" + clientSession.getId(), clientSession.getId(), nullptr), - _docBroker(std::move(docBroker)), - _peer(clientSession), - _curPart(0), - _gotStatus(false) -{ - LOG_INF("PrisonerSession ctor [" << getName() << "]."); -} - -PrisonerSession::~PrisonerSession() -{ - LOG_INF("~PrisonerSession dtor [" << getName() << "]."); -} - -bool PrisonerSession::_handleInput(const char *buffer, int length) -{ - LOG_TRC(getName() + ": handling [" << getAbbreviatedMessage(buffer, length) << "]."); - const std::string firstLine = getFirstLine(buffer, length); - StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - - LOOLWSD::dumpOutgoingTrace(_docBroker->getJailId(), getId(), firstLine); - - if (tokens[0] == "unocommandresult:") - { - const std::string stringMsg(buffer, length); - LOG_INF(getName() << ": Command: " << stringMsg); - const auto index = stringMsg.find_first_of('{'); - if (index != std::string::npos) - { - const std::string stringJSON = stringMsg.substr(index); - Poco::JSON::Parser parser; - const auto parsedJSON = parser.parse(stringJSON); - const auto& object = parsedJSON.extract<Poco::JSON::Object::Ptr>(); - if (object->get("commandName").toString() == ".uno:Save") - { - bool success = object->get("success").toString() == "true"; - std::string result; - if (object->has("result")) - { - const auto parsedResultJSON = object->get("result"); - const auto& resultObj = parsedResultJSON.extract<Poco::JSON::Object::Ptr>(); - if (resultObj->get("type").toString() == "string") - result = resultObj->get("value").toString(); - } - - // Save to Storage and log result. - _docBroker->save(getId(), success, result); - return true; - } - } - else - { - LOG_WRN("Expected json unocommandresult. Ignoring: " << stringMsg); - } - } - else if (tokens[0] == "error:") - { - std::string errorCommand; - std::string errorKind; - if (getTokenString(tokens[1], "cmd", errorCommand) && - getTokenString(tokens[2], "kind", errorKind) ) - { - if (errorCommand == "load") - { - if (errorKind == "passwordrequired:to-view" || - errorKind == "passwordrequired:to-modify" || - errorKind == "wrongpassword") - { - const auto payload = std::make_shared<Message>(buffer, length, - Message::Dir::Out, - Message::Type::Text); - forwardToPeer(payload); - LOG_WRN("Document load failed: " << errorKind); - return false; - } - } - } - } - else if (tokens[0] == "curpart:" && - tokens.count() == 2 && - getTokenInteger(tokens[1], "part", _curPart)) - { - return true; - } - else if (tokens.count() == 2 && tokens[0] == "saveas:") - { - std::string url; - if (!getTokenString(tokens[1], "url", url)) - { - LOG_ERR("Bad syntax for: " << firstLine); - return false; - } - - // Save-as completed, inform the ClientSession. - const std::string filePrefix("file:///"); - if (url.find(filePrefix) == 0) - { - // Rewrite file:// URLs, as they are visible to the outside world. - const Path path(_docBroker->getJailRoot(), url.substr(filePrefix.length())); - if (Poco::File(path).exists()) - { - url = filePrefix + path.toString().substr(1); - } - else - { - // Blank for failure. - LOG_DBG("SaveAs produced no output, producing blank url."); - url.clear(); - } - } - - _peer.setSaveAsUrl(url); - return true; - } - else if (tokens.count() == 2 && tokens[0] == "statechanged:") - { - if (_docBroker) - { - StringTokenizer stateTokens(tokens[1], "=", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - if (stateTokens.count() == 2 && stateTokens[0] == ".uno:ModifiedStatus") - { - _docBroker->setModified(stateTokens[1] == "true"); - } - } - } - - if (!_isDocPasswordProtected) - { - if (tokens[0] == "tile:") - { - assert(false && "Tile traffic should go through the DocumentBroker-LoKit WS."); - } - else if (tokens[0] == "status:") - { - _gotStatus = true; - _docBroker->setLoaded(); - - // Forward the status response to the client. - const auto payload = std::make_shared<Message>(buffer, length, - Message::Dir::Out, - Message::Type::Text); - return forwardToPeer(payload); - } - else if (tokens[0] == "commandvalues:") - { - const std::string stringMsg(buffer, length); - const auto index = stringMsg.find_first_of('{'); - if (index != std::string::npos) - { - const std::string stringJSON = stringMsg.substr(index); - Poco::JSON::Parser parser; - const auto result = parser.parse(stringJSON); - const auto& object = result.extract<Poco::JSON::Object::Ptr>(); - const std::string commandName = object->has("commandName") ? object->get("commandName").toString() : ""; - if (commandName == ".uno:CharFontName" || - commandName == ".uno:StyleApply") - { - // other commands should not be cached - _docBroker->tileCache().saveTextFile(stringMsg, "cmdValues" + commandName + ".txt"); - } - } - } - else if (tokens[0] == "partpagerectangles:") - { - if (tokens.count() > 1 && !tokens[1].empty()) - { - _docBroker->tileCache().saveTextFile(std::string(buffer, length), "partpagerectangles.txt"); - } - } - else if (tokens[0] == "invalidatetiles:") - { - assert(firstLine.size() == static_cast<std::string::size_type>(length)); - _docBroker->invalidateTiles(firstLine); - } - else if (tokens[0] == "invalidatecursor:") - { - assert(firstLine.size() == static_cast<std::string::size_type>(length)); - StringTokenizer firstLineTokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - int x = 0, y = 0, w = 0, h = 0; - if (firstLineTokens.count() > 2 && - stringToInteger(firstLineTokens[1], x) && - stringToInteger(firstLineTokens[2], y)) - { - if (firstLineTokens.count() > 3) - { - stringToInteger(firstLineTokens[3], w); - stringToInteger(firstLineTokens[4], h); - } - _docBroker->invalidateCursor(x, y, w, h); - } - else - { - LOG_ERR("Unable to parse " << firstLine); - } - } - else if (tokens[0] == "renderfont:") - { - std::string font, text; - if (tokens.count() < 3 || - !getTokenString(tokens[1], "font", font)) - { - LOG_ERR("Bad syntax for: " << firstLine); - return false; - } - - getTokenString(tokens[2], "char", text); - assert(firstLine.size() < static_cast<std::string::size_type>(length)); - _docBroker->tileCache().saveRendering(font+text, "font", buffer + firstLine.size() + 1, length - firstLine.size() - 1); - const auto payload = std::make_shared<Message>(buffer, length, - Message::Dir::Out, - Message::Type::Binary); - return forwardToPeer(payload); - } - } - else - { - LOG_INF("Ignoring notification on password protected document: " << firstLine); - } - - // Detect json messages, since we must send those as text even though they are multiline. - // If not, the UI will read the first line of a binary payload, assuming that's the only - // text part and the rest is binary. - const bool isBinary = buffer[length - 1] != '}' && firstLine.find('{') == std::string::npos; - - // Forward everything else. - const auto payload = std::make_shared<Message>(buffer, length, - Message::Dir::Out, - isBinary ? Message::Type::Binary - : Message::Type::Text); - return forwardToPeer(payload); -} - -bool PrisonerSession::forwardToPeer(const std::shared_ptr<Message>& payload) -{ - const auto& message = payload->abbr(); - - if (_peer.isCloseFrame()) - { - LOG_TRC(getName() << ": peer began the closing handshake. Dropping forward message [" << message << "]."); - return true; - } - - LOG_TRC(getName() << " -> " << _peer.getName() << ": " << message); - _peer.enqueueSendMessage(payload); - - return true; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/wsd/PrisonerSession.hpp b/wsd/PrisonerSession.hpp deleted file mode 100644 index a79e51e..0000000 --- a/wsd/PrisonerSession.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -#ifndef INCLUDED_PRISONERSESSION_HPP -#define INCLUDED_PRISONERSESSION_HPP - -#include "Session.hpp" - -class DocumentBroker; -class ClientSession; - -/// Represents an internal session to a Kit process, in the WSD process. -/// This doesn't really have a direct connection to any Kit process, rather -/// all communication to said Kit process is really handled by DocumentBroker. -class PrisonerSession final : public Session -{ -public: - PrisonerSession(ClientSession& clientSession, - std::shared_ptr<DocumentBroker> docBroker); - - virtual ~PrisonerSession(); - - /// Returns true if we've got status message. - bool gotStatus() const { return _gotStatus; } - -private: - /// Handle messages from the Kit to the client. - virtual bool _handleInput(const char* buffer, int length) override; - - bool forwardToPeer(const std::shared_ptr<Message>& payload); - -private: - std::shared_ptr<DocumentBroker> _docBroker; - ClientSession& _peer; - int _curPart; - bool _gotStatus; -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits