loolwsd/DocumentStoreManager.hpp | 148 +++++++++++++++++++++++++++++++++++++++ loolwsd/LOOLWSD.cpp | 2 loolwsd/LOOLWSD.hpp | 124 -------------------------------- loolwsd/MasterProcessSession.cpp | 2 loolwsd/MasterProcessSession.hpp | 2 5 files changed, 150 insertions(+), 128 deletions(-)
New commits: commit 73bde2b5d2ca37ab167f0164e773eda7d431866e Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Thu Mar 10 21:42:33 2016 -0500 loolwsd: moved DocumentURI into own file and renamed to DocumentStoreManager Change-Id: I5948ae532f0fd5917b99369733ec5ea36da2e437 Reviewed-on: https://gerrit.libreoffice.org/23204 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/DocumentStoreManager.hpp b/loolwsd/DocumentStoreManager.hpp new file mode 100644 index 0000000..76ae479 --- /dev/null +++ b/loolwsd/DocumentStoreManager.hpp @@ -0,0 +1,148 @@ +/* -*- 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_DOCUMENTSTOREMANAGER_HPP +#define INCLUDED_DOCUMENTSTOREMANAGER_HPP + +#include <atomic> +#include <mutex> +#include <string> + +#include <Poco/Path.h> + +#include "Storage.hpp" + +/// A DocumentStoreManager as mananged by us. +/// Contains URI, physical path, etc. +class DocumentStoreManager +{ +public: + + static + Poco::URI getUri(std::string uri) + { + // The URI of the document is url-encoded + // and passed in our URL. + if (uri.size() > 1 && uri[0] == '/') + { + // Remove leading '/'. + uri.erase(0, 1); + } + + std::string decodedUri; + Poco::URI::decode(uri, decodedUri); + auto uriPublic = Poco::URI(decodedUri); + + if (uriPublic.isRelative() || uriPublic.getScheme() == "file") + { + // TODO: Validate and limit access to local paths! + uriPublic.normalize(); + } + + Log::info("Public URI [" + uriPublic.toString() + "]."); + if (uriPublic.getPath().empty()) + { + throw std::runtime_error("Invalid URI."); + } + + return uriPublic; + } + + static + std::shared_ptr<DocumentStoreManager> create(const std::string& uri, + const std::string& jailRoot, + const std::string& childId) + { + std::string decodedUri; + Poco::URI::decode(uri, decodedUri); + auto uriPublic = Poco::URI(decodedUri); + + if (uriPublic.isRelative() || uriPublic.getScheme() == "file") + { + // TODO: Validate and limit access to local paths! + uriPublic.normalize(); + } + + Log::info("Public URI [" + uriPublic.toString() + "]."); + if (uriPublic.getPath().empty()) + { + throw std::runtime_error("Invalid URI."); + } + + return create(uriPublic, jailRoot, childId); + } + + static + std::shared_ptr<DocumentStoreManager> create( + const Poco::URI& uriPublic, + const std::string& jailRoot, + const std::string& childId) + { + Log::info("Creating DocumentStoreManager with uri: " + uriPublic.toString() + ", jailRoot: " + jailRoot + ", childId: " + childId); + + // The URL is the publicly visible one, not visible in the chroot jail. + // We need to map it to a jailed path and copy the file there. + + // user/doc/childId + const auto jailPath = Poco::Path(JailedDocumentRoot, childId); + + Log::info("jailPath: " + jailPath.toString() + ", jailRoot: " + jailRoot); + + auto uriJailed = uriPublic; + if (uriPublic.isRelative() || uriPublic.getScheme() == "file") + { + Log::info("Public URI [" + uriPublic.toString() + "] is a file."); + std::unique_ptr<StorageBase> storage(new LocalStorage(jailRoot, jailPath.toString(), uriPublic.getPath())); + const auto localPath = storage->getLocalFilePathFromStorage(); + uriJailed = Poco::URI(Poco::URI("file://"), localPath); + } + else + { + Log::info("Public URI [" + uriPublic.toString() + + "] assuming cloud storage."); + //TODO: Configure the storage to use. For now, assume it's WOPI. + std::unique_ptr<StorageBase> storage(new WopiStorage(jailRoot, jailPath.toString(), uriPublic.toString())); + const auto localPath = storage->getLocalFilePathFromStorage(); + uriJailed = Poco::URI(Poco::URI("file://"), localPath); + } + + auto document = std::shared_ptr<DocumentStoreManager>(new DocumentStoreManager(uriPublic, uriJailed, childId)); + + return document; + } + + ~DocumentStoreManager() + { + Log::info("~DocumentStoreManager [" + _uriPublic.toString() + "] destroyed."); + } + + Poco::URI getPublicUri() const { return _uriPublic; } + Poco::URI getJailedUri() const { return _uriJailed; } + std::string getJailId() const { return _jailId; } + +private: + DocumentStoreManager(const Poco::URI& uriPublic, + const Poco::URI& uriJailed, + const std::string& jailId) : + _uriPublic(uriPublic), + _uriJailed(uriJailed), + _jailId(jailId) + { + Log::info("DocumentStoreManager [" + _uriPublic.toString() + "] created."); + } + +private: + const Poco::URI _uriPublic; + const Poco::URI _uriJailed; + const std::string _jailId; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 5f841d8..23cc2a1 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -149,8 +149,6 @@ using Poco::Util::Option; using Poco::Util::OptionSet; using Poco::Util::ServerApplication; -// Document management mutex. -std::mutex DocumentURI::DocumentURIMutex; /// Handles the filename part of the convert-to POST request payload. class ConvertToPartHandler : public PartHandler diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp index d18ba1f..e0120fe 100644 --- a/loolwsd/LOOLWSD.hpp +++ b/loolwsd/LOOLWSD.hpp @@ -22,132 +22,8 @@ #include "Auth.hpp" #include "Common.hpp" -#include "Storage.hpp" #include "Util.hpp" -/// A DocumentURI as mananged by us. -/// Contains URI, physical path, etc. -class DocumentURI -{ -public: - - static - Poco::URI getUri(std::string uri) - { - // The URI of the document is url-encoded - // and passed in our URL. - if (uri.size() > 1 && uri[0] == '/') - { - // Remove leading '/'. - uri.erase(0, 1); - } - - std::string decodedUri; - Poco::URI::decode(uri, decodedUri); - auto uriPublic = Poco::URI(decodedUri); - - if (uriPublic.isRelative() || uriPublic.getScheme() == "file") - { - // TODO: Validate and limit access to local paths! - uriPublic.normalize(); - } - - Log::info("Public URI [" + uriPublic.toString() + "]."); - if (uriPublic.getPath().empty()) - { - throw std::runtime_error("Invalid URI."); - } - - return uriPublic; - } - - static - std::shared_ptr<DocumentURI> create(const std::string& uri, - const std::string& jailRoot, - const std::string& childId) - { - std::string decodedUri; - Poco::URI::decode(uri, decodedUri); - auto uriPublic = Poco::URI(decodedUri); - - if (uriPublic.isRelative() || uriPublic.getScheme() == "file") - { - // TODO: Validate and limit access to local paths! - uriPublic.normalize(); - } - - Log::info("Public URI [" + uriPublic.toString() + "]."); - if (uriPublic.getPath().empty()) - { - throw std::runtime_error("Invalid URI."); - } - - return create(uriPublic, jailRoot, childId); - } - - static - std::shared_ptr<DocumentURI> create(const Poco::URI& uriPublic, - const std::string& jailRoot, - const std::string& childId) - { - Log::info("DocumentURI: uri: " + uriPublic.toString() + ", jailRoot: " + jailRoot + ", childId: " + childId); - - // The URL is the publicly visible one, not visible in the chroot jail. - // We need to map it to a jailed path and copy the file there. - - // user/doc/childId - const auto jailPath = Poco::Path(JailedDocumentRoot, childId); - - Log::info("jailPath: " + jailPath.toString() + ", jailRoot: " + jailRoot); - - auto uriJailed = uriPublic; - if (uriPublic.isRelative() || uriPublic.getScheme() == "file") - { - Log::info("Public URI [" + uriPublic.toString() + "] is a file."); - std::unique_ptr<StorageBase> storage(new LocalStorage(jailRoot, jailPath.toString(), uriPublic.getPath())); - const auto localPath = storage->getLocalFilePathFromStorage(); - uriJailed = Poco::URI(Poco::URI("file://"), localPath); - } - else - { - Log::info("Public URI [" + uriPublic.toString() + - "] assuming cloud storage."); - //TODO: Configure the storage to use. For now, assume it's WOPI. - std::unique_ptr<StorageBase> storage(new WopiStorage(jailRoot, jailPath.toString(), uriPublic.toString())); - const auto localPath = storage->getLocalFilePathFromStorage(); - uriJailed = Poco::URI(Poco::URI("file://"), localPath); - } - - auto document = std::shared_ptr<DocumentURI>(new DocumentURI(uriPublic, uriJailed, childId)); - - Log::info("DocumentURI [" + uriPublic.toString() + "] created."); - return document; - } - - Poco::URI getPublicUri() const { return _uriPublic; } - Poco::URI getJailedUri() const { return _uriJailed; } - std::string getJailId() const { return _jailId; } - -private: - DocumentURI(const Poco::URI& uriPublic, - const Poco::URI& uriJailed, - const std::string& jailId) : - _uriPublic(uriPublic), - _uriJailed(uriJailed), - _jailId(jailId) - { - } - -private: - - // DocumentURI management mutex. - static std::mutex DocumentURIMutex; - -private: - const Poco::URI _uriPublic; - const Poco::URI _uriJailed; - const std::string _jailId; -}; class LOOLWSD: public Poco::Util::ServerApplication { diff --git a/loolwsd/MasterProcessSession.cpp b/loolwsd/MasterProcessSession.cpp index 18b9cec..307b1ae 100644 --- a/loolwsd/MasterProcessSession.cpp +++ b/loolwsd/MasterProcessSession.cpp @@ -799,7 +799,7 @@ void MasterProcessSession::dispatchChild() } const auto jailRoot = Poco::Path(LOOLWSD::ChildRoot, childSession->_childId); - auto document = DocumentURI::create(_docURL, jailRoot.toString(), childSession->_childId); + auto document = DocumentStoreManager::create(_docURL, jailRoot.toString(), childSession->_childId); _peer = childSession; childSession->_peer = shared_from_this(); diff --git a/loolwsd/MasterProcessSession.hpp b/loolwsd/MasterProcessSession.hpp index 68c82d2..d6cceb0 100644 --- a/loolwsd/MasterProcessSession.hpp +++ b/loolwsd/MasterProcessSession.hpp @@ -10,9 +10,9 @@ #ifndef INCLUDED_MASTERPROCESSSESSION_HPP #define INCLUDED_MASTERPROCESSSESSION_HPP - #include <Poco/Random.h> +#include "DocumentStoreManager.hpp" #include "LOOLSession.hpp" #include "TileCache.hpp" _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits