wsd/ClientSession.cpp  |    1 
 wsd/DocumentBroker.cpp |   19 ++++++++---------
 wsd/DocumentBroker.hpp |    1 
 wsd/Storage.cpp        |   46 ++++++-------------------------------------
 wsd/Storage.hpp        |   52 +++----------------------------------------------
 5 files changed, 21 insertions(+), 98 deletions(-)

New commits:
commit 9db41725f423f00f95db4b68d70827d24f80bb6c
Author: Jan Holesovsky <ke...@collabora.com>
Date:   Fri May 19 10:32:24 2017 +0200

    Revert "wsd: use WOPI host instance ID to support hostname aliases"
    
    Turns out this introduces two calls to the CheckFileInfo which is not really
    what we should be doing; instead, let's do a kind of cannonicalization in 
the
    WOPI host directly.
    
    This reverts commit ec2fd0844f997f9a7347229e282daeb8dc4471bc.
    
    Change-Id: I311bf8a45b706ed9a4d8cd00db0a990ac6d461b4

diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 479bc2b9..105b30d3 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -737,6 +737,7 @@ bool ClientSession::forwardToClient(const 
std::shared_ptr<Message>& payload)
 
 std::string ClientSession::getAccessToken() const
 {
+    std::string accessToken;
     Poco::URI::QueryParameters queryParams = _uriPublic.getQueryParameters();
     for (auto& param: queryParams)
     {
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 66a5de80..e5924f87 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -102,7 +102,15 @@ Poco::URI DocumentBroker::sanitizeURI(const std::string& 
uri)
 
 std::string DocumentBroker::getDocKey(const Poco::URI& uri)
 {
-    return StorageBase::getUniqueDocId(uri);
+    // If multiple host-names are used to access us, then
+    // we force same document (when opened from
+    // alias hosts) to load as separate documents and sharing doesn't
+    // work. Worse, saving overwrites one another.
+    // But we also do not want different WOPI hosts using the same path
+    // for some file getting shared across WOPI hosts
+    std::string docKey;
+    Poco::URI::encode(uri.getHost() + ":" + std::to_string(uri.getPort()) + 
uri.getPath(), "", docKey);
+    return docKey;
 }
 
 /// The Document Broker Poll - one of these in a thread per document
@@ -401,7 +409,6 @@ bool DocumentBroker::load(const 
std::shared_ptr<ClientSession>& session, const s
             LOG_ERR("Failed to create Storage instance for [" << _docKey << "] 
in " << jailPath.toString());
             return false;
         }
-
         firstInstance = true;
     }
 
@@ -416,14 +423,6 @@ bool DocumentBroker::load(const 
std::shared_ptr<ClientSession>& session, const s
         std::unique_ptr<WopiStorage::WOPIFileInfo> wopifileinfo = 
wopiStorage->getWOPIFileInfo(session->getAccessToken());
         userid = wopifileinfo->_userid;
         username = wopifileinfo->_username;
-        if (firstInstance)
-        {
-            _hostInstanceId = wopifileinfo->_hostInstanceId;
-        }
-        else if (!_hostInstanceId.empty() && _hostInstanceId != 
wopifileinfo->_hostInstanceId)
-        {
-            throw UnauthorizedRequestException("Unauthorized WOPI host.");
-        }
 
         if (!wopifileinfo->_userCanWrite)
         {
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index 8ac67ee2..46481cba 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -369,7 +369,6 @@ private:
     Poco::URI _uriJailed;
     std::string _jailId;
     std::string _filename;
-    std::string _hostInstanceId;
 
     /// The last time we tried saving, regardless of whether the
     /// document was modified and saved or not.
diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp
index 0c31e53c..12f0a49e 100644
--- a/wsd/Storage.cpp
+++ b/wsd/Storage.cpp
@@ -125,7 +125,7 @@ void StorageBase::initialize()
 #endif
 }
 
-bool StorageBase::isLocalhost(const std::string& targetHost)
+bool isLocalhost(const std::string& targetHost)
 {
     std::string targetAddress;
     try
@@ -202,7 +202,7 @@ std::unique_ptr<StorageBase> StorageBase::create(const 
Poco::URI& uri, const std
     {
         LOG_INF("Public URI [" << uri.toString() << "] considered WOPI.");
         const auto& targetHost = uri.getHost();
-        if (isWopiHostAuthorized(targetHost))
+        if (WopiHosts.match(targetHost) || isLocalhost(targetHost))
         {
             return std::unique_ptr<StorageBase>(new WopiStorage(uri, jailRoot, 
jailPath));
         }
@@ -213,39 +213,6 @@ std::unique_ptr<StorageBase> StorageBase::create(const 
Poco::URI& uri, const std
     throw BadRequestException("No Storage configured or invalid URI.");
 }
 
-std::string StorageBase::getUniqueDocId(const Poco::URI& uri)
-{
-    std::string docId;
-    if (uri.isRelative() || uri.getScheme() == "file")
-    {
-        Poco::URI::encode(uri.getPath(), "", docId);
-    }
-    else if (WopiEnabled)
-    {
-        const auto& targetHost = uri.getHost();
-        if (isWopiHostAuthorized(targetHost))
-        {
-            std::string accessToken;
-            Poco::URI::QueryParameters queryParams = uri.getQueryParameters();
-            for (auto& param: queryParams)
-            {
-                if (param.first == "access_token")
-                    accessToken = param.second;
-            }
-
-            const std::unique_ptr<WopiStorage::WOPIFileInfo> info = 
WopiStorage::getWOPIFileInfo(uri, accessToken);
-            const std::string prefix = !info->_hostInstanceId.empty()
-                                     ? info->_hostInstanceId
-                                     : (uri.getHost() + ':' + 
std::to_string(uri.getPort()));
-            Poco::URI::encode(prefix + uri.getPath(), "", docId);
-        }
-        else
-            throw UnauthorizedRequestException("No acceptable WOPI hosts found 
matching the target host [" + targetHost + "] in config.");
-    }
-
-    return docId;
-}
-
 std::atomic<unsigned> LocalStorage::LastLocalStorageId;
 
 std::unique_ptr<LocalStorage::LocalFileInfo> LocalStorage::getLocalFileInfo()
@@ -459,9 +426,10 @@ void addStorageDebugCookie(Poco::Net::HTTPRequest& request)
 
 } // anonymous namespace
 
-std::unique_ptr<WopiStorage::WOPIFileInfo> 
WopiStorage::getWOPIFileInfo(Poco::URI uriObject, const std::string& 
accessToken)
+std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const 
std::string& accessToken)
 {
     // update the access_token to the one matching to the session
+    Poco::URI uriObject(_uri);
     setQueryParameter(uriObject, "access_token", accessToken);
 
     LOG_DBG("Getting info for wopi uri [" << uriObject.toString() << "].");
@@ -509,7 +477,6 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> 
WopiStorage::getWOPIFileInfo(Poco::UR
     std::string ownerId;
     std::string userId;
     std::string userName;
-    std::string hostInstanceId;
     bool canWrite = false;
     bool enableOwnerTermination = false;
     std::string postMessageOrigin;
@@ -544,7 +511,6 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> 
WopiStorage::getWOPIFileInfo(Poco::UR
         getWOPIValue(object, "DisableExport", disableExport);
         getWOPIValue(object, "DisableCopy", disableCopy);
         getWOPIValue(object, "LastModifiedTime", lastModifiedTime);
-        getWOPIValue(object, "HostInstanceId", hostInstanceId);
     }
     else
     {
@@ -574,7 +540,9 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> 
WopiStorage::getWOPIFileInfo(Poco::UR
         }
     }
 
-    return std::unique_ptr<WopiStorage::WOPIFileInfo>(new 
WOPIFileInfo(filename, ownerId, modifiedTime, size, userId, userName, 
hostInstanceId, canWrite, postMessageOrigin, hidePrintOption, hideSaveOption, 
hideExportOption, enableOwnerTermination, disablePrint, disableExport, 
disableCopy, callDuration));
+    _fileInfo = FileInfo({filename, ownerId, modifiedTime, size});
+
+    return std::unique_ptr<WopiStorage::WOPIFileInfo>(new 
WOPIFileInfo({userId, userName, canWrite, postMessageOrigin, hidePrintOption, 
hideSaveOption, hideExportOption, enableOwnerTermination, disablePrint, 
disableExport, disableCopy, callDuration}));
 }
 
 /// uri format: http://server/<...>/wopi*/files/<id>/content
diff --git a/wsd/Storage.hpp b/wsd/Storage.hpp
index 7cb77432..6613fbbc 100644
--- a/wsd/Storage.hpp
+++ b/wsd/Storage.hpp
@@ -100,29 +100,11 @@ public:
     static std::unique_ptr<StorageBase> create(const Poco::URI& uri,
                                                const std::string& jailRoot,
                                                const std::string& jailPath);
-
-    /// Given the URI of a doc, return a unique doc ID.
-    /// Wopi host aliases are resolved to unique host ID.
-    static std::string getUniqueDocId(const Poco::URI& uri);
-
 protected:
 
     /// Returns the root path of the jail directory of docs.
     std::string getLocalRootPath() const;
 
-    /// Returns true iff WOPI is enabled, and the host is whitelisted (or 
local).
-    static bool isWopiHostAuthorized(const std::string& host)
-    {
-        if (WopiEnabled)
-        {
-            return (WopiHosts.match(host) || isLocalhost(host));
-        }
-
-        return false;
-    }
-
-    static bool isLocalhost(const std::string& host);
-
 protected:
     const Poco::URI _uri;
     std::string _localStorePath;
@@ -194,16 +176,11 @@ public:
                 "], jailPath: [" << jailPath << "], uri: [" << uri.toString() 
<< "].");
     }
 
-    class WOPIFileInfo : public FileInfo
+    class WOPIFileInfo
     {
     public:
-        WOPIFileInfo(const std::string& filename,
-                     const std::string& ownerId,
-                     const Poco::Timestamp& modifiedTime,
-                     size_t size,
-                     const std::string& userid,
+        WOPIFileInfo(const std::string& userid,
                      const std::string& username,
-                     const std::string& hostInstanceId,
                      const bool userCanWrite,
                      const std::string& postMessageOrigin,
                      const bool hidePrintOption,
@@ -214,10 +191,8 @@ public:
                      const bool disableExport,
                      const bool disableCopy,
                      const std::chrono::duration<double> callDuration)
-            : FileInfo(filename, ownerId, modifiedTime, size),
-              _userid(userid),
+            : _userid(userid),
               _username(username),
-              _hostInstanceId(hostInstanceId),
               _userCanWrite(userCanWrite),
               _postMessageOrigin(postMessageOrigin),
               _hidePrintOption(hidePrintOption),
@@ -235,8 +210,6 @@ public:
         std::string _userid;
         /// Display Name of user accessing the file
         std::string _username;
-        /// Host instance ID (unique to the given host).
-        std::string _hostInstanceId;
         /// If user accessing the file has write permission
         bool _userCanWrite;
         /// WOPI Post message property
@@ -263,12 +236,7 @@ public:
     /// provided during the initial creation of the WOPI storage.
     /// Also extracts the basic file information from the response
     /// which can then be obtained using getFileInfo()
-    std::unique_ptr<WOPIFileInfo> getWOPIFileInfo(const std::string& 
accessToken)
-    {
-        std::unique_ptr<WOPIFileInfo> info = getWOPIFileInfo(_uri, 
accessToken);
-        _fileInfo = FileInfo(info->_filename, info->_ownerId, 
info->_modifiedTime, info->_size);
-        return info;
-    }
+    std::unique_ptr<WOPIFileInfo> getWOPIFileInfo(const std::string& 
accessToken);
 
     /// uri format: http://server/<...>/wopi*/files/<id>/content
     std::string loadStorageFileToLocal(const std::string& accessToken) 
override;
@@ -278,11 +246,6 @@ public:
     /// Total time taken for making WOPI calls during load
     std::chrono::duration<double> getWopiLoadDuration() const { return 
_wopiLoadDuration; }
 
-    /// Given the URI of a doc, return a unique doc ID.
-    static std::string getUniqueDocId(const Poco::URI& uri);
-
-    static std::unique_ptr<WOPIFileInfo> getWOPIFileInfo(Poco::URI uriObject, 
const std::string& accessToken);
-
 private:
     // Time spend in loading the file from storage
     std::chrono::duration<double> _wopiLoadDuration;
@@ -310,13 +273,6 @@ public:
 
     SaveResult saveLocalFileToStorage(const std::string& accessToken) override;
 
-    /// Given the URI of a doc, return a unique doc ID.
-    static std::string getUniqueDocId(const std::string& uri)
-    {
-        // TODO: Implement.
-        return uri;
-    }
-
 private:
     std::unique_ptr<AuthBase> _authAgent;
 };
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to