wsd/ClientSession.cpp | 36 +++++++++++++++++++++++++++++++++++- wsd/DocumentBroker.cpp | 13 ++++++++++++- wsd/DocumentBroker.hpp | 9 +++++++++ wsd/Storage.cpp | 32 ++++++++++++++++++++++++-------- wsd/Storage.hpp | 24 ++++++++++++++++++++---- 5 files changed, 100 insertions(+), 14 deletions(-)
New commits: commit 9927458251fd069e11efc8e83c78449497cc2048 Author: Ashod Nakashian <[email protected]> Date: Tue Apr 24 12:09:37 2018 -0400 wsd: support optional forcing tracking changes at load Since changing the tracking state is done by toggling, we need to wait to get the current state at load time before we can tell whether we need to toggle it or not. Change-Id: Ib5a2639b2acf3874c191971eedf9a3bebcefebad Reviewed-on: https://gerrit.libreoffice.org/53426 Tested-by: Aron Budea <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index 77a6e075a..8b1d6654c 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -19,6 +19,7 @@ #include "DocumentBroker.hpp" #include "LOOLWSD.hpp" +#include "Storage.hpp" #include "common/Common.hpp" #include "common/Log.hpp" #include "common/Protocol.hpp" @@ -738,6 +739,40 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt { docBroker->setModified(stateTokens[1] == "true"); } + else + { + // Set the initial settings per the user's request. + const std::pair<std::string, std::string> unoStatePair = LOOLProtocol::split(tokens[1], '='); + + if (!docBroker->isInitialSettingSet(unoStatePair.first)) + { + docBroker->setInitialSetting(unoStatePair.first); + if (unoStatePair.first == ".uno:TrackChanges") + { + if ((unoStatePair.second == "true" && + _wopiFileInfo->_disableChangeTrackingRecord == WopiStorage::WOPIFileInfo::TriState::True) || + (unoStatePair.second == "false" && + _wopiFileInfo->_disableChangeTrackingRecord == WopiStorage::WOPIFileInfo::TriState::False)) + { + // Toggle the TrackChanges state. + LOG_DBG("Forcing " << unoStatePair.first << " toggle per user settings."); + forwardToChild("uno .uno:TrackChanges", docBroker); + } + } + else if (unoStatePair.first == ".uno:ShowTrackedChanges") + { + if ((unoStatePair.second == "true" && + _wopiFileInfo->_disableChangeTrackingShow == WopiStorage::WOPIFileInfo::TriState::True) || + (unoStatePair.second == "false" && + _wopiFileInfo->_disableChangeTrackingShow == WopiStorage::WOPIFileInfo::TriState::False)) + { + // Toggle the ShowTrackChanges state. + LOG_DBG("Forcing " << unoStatePair.first << " toggle per user settings."); + forwardToChild("uno .uno:ShowTrackedChanges", docBroker); + } + } + } + } } if (!_isDocPasswordProtected) @@ -843,7 +878,6 @@ bool ClientSession::forwardToClient(const std::shared_ptr<Message>& payload) } enqueueSendMessage(payload); - return true; } diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index 72c618831..2b08c4882 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -502,12 +502,13 @@ bool DocumentBroker::load(const std::shared_ptr<ClientSession>& session, const s wopiInfo->set("HidePrintOption", wopifileinfo->_hidePrintOption); wopiInfo->set("HideSaveOption", wopifileinfo->_hideSaveOption); wopiInfo->set("HideExportOption", wopifileinfo->_hideExportOption); - wopiInfo->set("HideChangeTrackingControls", wopifileinfo->_hideChangeTrackingControls); wopiInfo->set("DisablePrint", wopifileinfo->_disablePrint); wopiInfo->set("DisableExport", wopifileinfo->_disableExport); wopiInfo->set("DisableCopy", wopifileinfo->_disableCopy); wopiInfo->set("DisableInactiveMessages", wopifileinfo->_disableInactiveMessages); wopiInfo->set("UserCanNotWriteRelative", wopifileinfo->_userCanNotWriteRelative); + if (wopifileinfo->_hideChangeTrackingControls != WopiStorage::WOPIFileInfo::TriState::Unset) + wopiInfo->set("HideChangeTrackingControls", wopifileinfo->_hideChangeTrackingControls == WopiStorage::WOPIFileInfo::TriState::True); std::ostringstream ossWopiInfo; wopiInfo->stringify(ossWopiInfo); @@ -1447,6 +1448,16 @@ void DocumentBroker::setModified(const bool value) _tileCache->setUnsavedChanges(value); } +bool DocumentBroker::isInitialSettingSet(const std::string& name) const +{ + return _isInitialStateSet.find(name) != _isInitialStateSet.end(); +} + +void DocumentBroker::setInitialSetting(const std::string& name) +{ + _isInitialStateSet.emplace(name); +} + bool DocumentBroker::forwardToChild(const std::string& viewId, const std::string& message) { assertCorrectThread(); diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp index 443d8ab52..58af3c913 100644 --- a/wsd/DocumentBroker.hpp +++ b/wsd/DocumentBroker.hpp @@ -350,6 +350,12 @@ public: /// Sends a message to all sessions void broadcastMessage(const std::string& message); + /// Returns true iff an initial setting by the given name is already initialized. + bool isInitialSettingSet(const std::string& name) const; + + /// Sets the initialization flag of a given initial setting. + void setInitialSetting(const std::string& name); + private: /// Shutdown all client connections with the given reason. @@ -429,6 +435,9 @@ private: /// All session of this DocBroker by ID. std::map<std::string, std::shared_ptr<ClientSession> > _sessions; + /// If we set the user-requested inital (on load) settings to be forced. + std::set<std::string> _isInitialStateSet; + std::unique_ptr<StorageBase> _storage; std::unique_ptr<TileCache> _tileCache; std::atomic<bool> _markToDestroy; diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp index ccf92234c..d543420c0 100644 --- a/wsd/Storage.cpp +++ b/wsd/Storage.cpp @@ -115,7 +115,7 @@ void StorageBase::initialize() // Init client Poco::Net::Context::Params sslClientParams; - // TODO: Be more strict and setup SSL key/certs for remove server and us + // TODO: Be more strict and setup SSL key/certs for remote server and us sslClientParams.verificationMode = Poco::Net::Context::VERIFY_NONE; Poco::SharedPtr<Poco::Net::PrivateKeyPassphraseHandler> consoleClientHandler = new Poco::Net::KeyConsoleHandler(false); @@ -325,7 +325,8 @@ StorageBase::SaveResult LocalStorage::saveLocalFileToStorage(const Authorization return StorageBase::SaveResult(StorageBase::SaveResult::OK); } -namespace { +namespace +{ inline Poco::Net::HTTPClientSession* getHTTPClientSession(const Poco::URI& uri) @@ -391,7 +392,7 @@ T getJSONValue(const Poco::JSON::Object::Ptr &object, const std::string& key) // Function that searches `object` for `key` and warns if there are minor mis-spellings involved // Upon successfull search, fills `value` with value found in object. template <typename T> -void getWOPIValue(const Poco::JSON::Object::Ptr &object, const std::string& key, T& value) +bool getWOPIValue(const Poco::JSON::Object::Ptr &object, const std::string& key, T& value) { std::vector<std::string> propertyNames; object->getNames(propertyNames); @@ -411,14 +412,15 @@ void getWOPIValue(const Poco::JSON::Object::Ptr &object, const std::string& key, else if (levDist > 0 || key != userInput) { LOG_WRN("Incorrect JSON property [" << userInput << "]. Did you mean " << key << " ?"); - return; + return false; } value = getJSONValue<T>(object, userInput); - return; + return true; } LOG_WRN("Missing JSON property [" << key << "]"); + return false; } // Parse the json string and fill the Poco::JSON object @@ -544,13 +546,15 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Au bool hidePrintOption = false; bool hideSaveOption = false; bool hideExportOption = false; - bool hideChangeTrackingControls = false; bool disablePrint = false; bool disableExport = false; bool disableCopy = false; bool disableInactiveMessages = false; std::string lastModifiedTime; bool userCanNotWriteRelative = true; + WOPIFileInfo::TriState disableChangeTrackingRecord = WOPIFileInfo::TriState::Unset; + WOPIFileInfo::TriState disableChangeTrackingShow = WOPIFileInfo::TriState::Unset; + WOPIFileInfo::TriState hideChangeTrackingControls = WOPIFileInfo::TriState::Unset; LOG_DBG("WOPI::CheckFileInfo returned: " << resMsg << ". Call duration: " << callDuration.count() << "s"); Poco::JSON::Object::Ptr object; @@ -568,7 +572,6 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Au getWOPIValue(object, "HidePrintOption", hidePrintOption); getWOPIValue(object, "HideSaveOption", hideSaveOption); getWOPIValue(object, "HideExportOption", hideExportOption); - getWOPIValue(object, "hideChangeTrackingControls", hideChangeTrackingControls); getWOPIValue(object, "EnableOwnerTermination", enableOwnerTermination); getWOPIValue(object, "DisablePrint", disablePrint); getWOPIValue(object, "DisableExport", disableExport); @@ -576,6 +579,13 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Au getWOPIValue(object, "DisableInactiveMessages", disableInactiveMessages); getWOPIValue(object, "LastModifiedTime", lastModifiedTime); getWOPIValue(object, "UserCanNotWriteRelative", userCanNotWriteRelative); + bool booleanFlag = false; + if (getWOPIValue(object, "DisableChangeTrackingRecord", booleanFlag)) + disableChangeTrackingRecord = (booleanFlag ? WOPIFileInfo::TriState::True : WOPIFileInfo::TriState::False); + if (getWOPIValue(object, "DisableChangeTrackingShow", booleanFlag)) + disableChangeTrackingShow = (booleanFlag ? WOPIFileInfo::TriState::True : WOPIFileInfo::TriState::False); + if (getWOPIValue(object, "HideChangeTrackingControls", booleanFlag)) + hideChangeTrackingControls = (booleanFlag ? WOPIFileInfo::TriState::True : WOPIFileInfo::TriState::False); } else { @@ -586,7 +596,13 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Au const Poco::Timestamp modifiedTime = iso8601ToTimestamp(lastModifiedTime); _fileInfo = FileInfo({filename, ownerId, modifiedTime, size}); - return std::unique_ptr<WopiStorage::WOPIFileInfo>(new WOPIFileInfo({userId, userName, userExtraInfo, watermarkText, canWrite, postMessageOrigin, hidePrintOption, hideSaveOption, hideExportOption, hideChangeTrackingControls, enableOwnerTermination, disablePrint, disableExport, disableCopy, disableInactiveMessages, userCanNotWriteRelative, callDuration})); + return std::unique_ptr<WopiStorage::WOPIFileInfo>(new WOPIFileInfo( + {userId, userName, userExtraInfo, watermarkText, canWrite, + postMessageOrigin, hidePrintOption, hideSaveOption, hideExportOption, + enableOwnerTermination, disablePrint, disableExport, disableCopy, + disableInactiveMessages, userCanNotWriteRelative, + disableChangeTrackingShow, disableChangeTrackingRecord, + hideChangeTrackingControls, callDuration})); } /// uri format: http://server/<...>/wopi*/files/<id>/content diff --git a/wsd/Storage.hpp b/wsd/Storage.hpp index 1d96afd36..d033a846b 100644 --- a/wsd/Storage.hpp +++ b/wsd/Storage.hpp @@ -259,6 +259,13 @@ public: class WOPIFileInfo { public: + enum class TriState + { + False, + True, + Unset + }; + WOPIFileInfo(const std::string& userid, const std::string& username, const std::string& userExtraInfo, @@ -268,13 +275,15 @@ public: const bool hidePrintOption, const bool hideSaveOption, const bool hideExportOption, - const bool hideChangeTrackingControls, const bool enableOwnerTermination, const bool disablePrint, const bool disableExport, const bool disableCopy, const bool disableInactiveMessages, const bool userCanNotWriteRelative, + const TriState disableChangeTrackingShow, + const TriState disableChangeTrackingRecord, + const TriState hideChangeTrackingControls, const std::chrono::duration<double> callDuration) : _userid(userid), _username(username), @@ -284,13 +293,15 @@ public: _hidePrintOption(hidePrintOption), _hideSaveOption(hideSaveOption), _hideExportOption(hideExportOption), - _hideChangeTrackingControls(hideChangeTrackingControls), _enableOwnerTermination(enableOwnerTermination), _disablePrint(disablePrint), _disableExport(disableExport), _disableCopy(disableCopy), _disableInactiveMessages(disableInactiveMessages), _userCanNotWriteRelative(userCanNotWriteRelative), + _disableChangeTrackingShow(disableChangeTrackingShow), + _disableChangeTrackingRecord(disableChangeTrackingRecord), + _hideChangeTrackingControls(hideChangeTrackingControls), _callDuration(callDuration) { _userExtraInfo = userExtraInfo; @@ -314,8 +325,6 @@ public: bool _hideSaveOption; /// Hide 'Download as' button/menubar item from UI bool _hideExportOption; - /// Hide change tacking menu from UI - bool _hideChangeTrackingControls; /// If WOPI host has enabled owner termination feature on bool _enableOwnerTermination; /// If WOPI host has allowed the user to print the document @@ -328,6 +337,13 @@ public: bool _disableInactiveMessages; /// If set to false, users can access the save-as functionality bool _userCanNotWriteRelative; + /// If we should disable change-tracking visibility by default (meaningful at loading). + TriState _disableChangeTrackingShow; + /// If we should disable change-tracking ability by default (meaningful at loading). + TriState _disableChangeTrackingRecord; + /// If we should hide change-tracking commands for this user. + TriState _hideChangeTrackingControls; + /// Time it took to call WOPI's CheckFileInfo std::chrono::duration<double> _callDuration; }; _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
