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

Reply via email to