[Libreoffice-commits] online.git: 4 commits - loolwsd/Admin.cpp loolwsd/DocumentBroker.hpp loolwsd/FileServer.cpp loolwsd/FileServer.hpp loolwsd/LOOLWSD.cpp loolwsd/Makefile.am
Pranav Kant
pranavk at collabora.co.uk
Tue Jul 19 17:25:18 UTC 2016
loolwsd/Admin.cpp | 2
loolwsd/DocumentBroker.hpp | 2
loolwsd/FileServer.cpp | 245 +++++++++++++++++++++++++++++++++++++++++++++
loolwsd/FileServer.hpp | 232 +-----------------------------------------
loolwsd/LOOLWSD.cpp | 1
loolwsd/Makefile.am | 2
6 files changed, 257 insertions(+), 227 deletions(-)
New commits:
commit f9b86d749d4e10c314431a180d212f63e551c52a
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Tue Jul 19 22:44:32 2016 +0530
loolwsd: Split FileServer into header/implementation
Change-Id: Idf0d2cb92028a79b8b32e0225ce5be1a1156542e
diff --git a/loolwsd/FileServer.cpp b/loolwsd/FileServer.cpp
new file mode 100644
index 0000000..507f512
--- /dev/null
+++ b/loolwsd/FileServer.cpp
@@ -0,0 +1,245 @@
+/* -*- 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 "config.h"
+
+#include <string>
+#include <vector>
+
+#include <Poco/FileStream.h>
+#include <Poco/Net/HTTPCookie.h>
+#include <Poco/Net/HTTPBasicCredentials.h>
+#include <Poco/Net/HTMLForm.h>
+#include <Poco/Net/HTTPRequest.h>
+#include <Poco/Net/HTTPRequestHandler.h>
+#include <Poco/Net/HTTPServer.h>
+#include <Poco/Net/HTTPServerParams.h>
+#include <Poco/Net/HTTPServerRequest.h>
+#include <Poco/Net/HTTPServerResponse.h>
+#include <Poco/Net/NetException.h>
+#include <Poco/Net/SecureServerSocket.h>
+#include <Poco/Net/WebSocket.h>
+#include <Poco/RegularExpression.h>
+#include <Poco/Runnable.h>
+#include <Poco/StreamCopier.h>
+#include <Poco/StringTokenizer.h>
+#include <Poco/URI.h>
+#include <Poco/Util/ServerApplication.h>
+#include <Poco/Util/Timer.h>
+
+#include "Common.hpp"
+#include "FileServer.hpp"
+#include "LOOLWSD.hpp"
+
+using Poco::FileInputStream;
+using Poco::Net::HTMLForm;
+using Poco::Net::HTTPRequest;
+using Poco::Net::HTTPRequestHandler;
+using Poco::Net::HTTPRequestHandlerFactory;
+using Poco::Net::HTTPResponse;
+using Poco::Net::HTTPServerParams;
+using Poco::Net::HTTPServerRequest;
+using Poco::Net::HTTPServerResponse;
+using Poco::Net::SecureServerSocket;
+using Poco::Net::HTTPBasicCredentials;
+using Poco::StreamCopier;
+using Poco::Util::Application;
+
+bool FileServerRequestHandler::isAdminLoggedIn(HTTPServerRequest& request, HTTPServerResponse& response)
+{
+ const auto& config = Application::instance().config();
+ const auto sslKeyPath = config.getString("ssl.key_file_path", "");
+
+ if (request.find("Cookie") != request.end())
+ {
+ // FIXME: Handle other cookie params like '; httponly; secure'
+ const std::size_t pos = request["Cookie"].find_first_of("=");
+ if (pos == std::string::npos)
+ throw Poco::Net::NotAuthenticatedException("Missing JWT");
+
+ const std::string jwtToken = request["Cookie"].substr(pos + 1);
+ Log::info("Verifying JWT token: " + jwtToken);
+ JWTAuth authAgent(sslKeyPath, "admin", "admin", "admin");
+ if (authAgent.verify(jwtToken))
+ {
+ Log::trace("JWT token is valid");
+ return true;
+ }
+
+ Log::info("Invalid JWT token, let the administrator re-login");
+ }
+
+ const auto user = config.getString("admin_console.username", "");
+ const auto pass = config.getString("admin_console.password", "");
+ if (user.empty() || pass.empty())
+ {
+ Log::error("Admin Console credentials missing. Denying access until set.");
+ return false;
+ }
+
+ HTTPBasicCredentials credentials(request);
+ if (credentials.getUsername() == user &&
+ credentials.getPassword() == pass)
+ {
+ const std::string htmlMimeType = "text/html";
+ // generate and set the cookie
+ JWTAuth authAgent(sslKeyPath, "admin", "admin", "admin");
+ const std::string jwtToken = authAgent.getAccessToken();
+ Poco::Net::HTTPCookie cookie("jwt", jwtToken);
+ cookie.setPath("/lool/adminws/");
+ cookie.setSecure(true);
+ cookie.setHttpOnly(true);
+ response.addCookie(cookie);
+
+ return true;
+ }
+
+ Log::info("Wrong admin credentials.");
+ return false;
+}
+
+void FileServerRequestHandler::handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
+{
+ try
+ {
+ Poco::URI requestUri(request.getURI());
+ requestUri.normalize(); // avoid .'s and ..'s
+
+ std::vector<std::string> requestSegments;
+ requestUri.getPathSegments(requestSegments);
+ if (requestSegments.size() < 1)
+ {
+ throw Poco::FileNotFoundException("Invalid URI request: [" + requestUri.toString() + "].");
+ }
+
+ const auto& config = Application::instance().config();
+ const std::string loleafletHtml = config.getString("loleaflet_html", "loleaflet.html");
+ const std::string endPoint = requestSegments[requestSegments.size() - 1];
+ if (endPoint == loleafletHtml)
+ {
+ preprocessFile(request, response);
+ return;
+ }
+
+ if (request.getMethod() == HTTPRequest::HTTP_GET)
+ {
+ if (endPoint == "admin.html" ||
+ endPoint == "adminSettings.html" ||
+ endPoint == "adminAnalytics.html")
+ {
+ if (!FileServerRequestHandler::isAdminLoggedIn(request, response))
+ throw Poco::Net::NotAuthenticatedException("Invalid admin login");
+ }
+
+ const auto path = Poco::Path(LOOLWSD::FileServerRoot, getRequestPathname(request));
+ const auto filepath = path.absolute().toString();
+ if (filepath.find(LOOLWSD::FileServerRoot) != 0)
+ {
+ // Accessing unauthorized path.
+ throw Poco::FileAccessDeniedException("Invalid or forbidden file path: [" + filepath + "].");
+ }
+
+ const std::size_t extPoint = endPoint.find_last_of(".");
+ if (extPoint == std::string::npos)
+ throw Poco::FileNotFoundException("Invalid file.");
+
+ const std::string fileType = endPoint.substr(extPoint + 1);
+ std::string mimeType;
+ if (fileType == "js")
+ mimeType = "application/javascript";
+ else if (fileType == "css")
+ mimeType = "text/css";
+ else if (fileType == "html")
+ mimeType = "text/html";
+ else if (fileType == "svg")
+ mimeType = "image/svg+xml";
+ else
+ mimeType = "text/plain";
+
+ response.setContentType(mimeType);
+ response.sendFile(filepath, mimeType);
+ }
+ }
+ catch (const Poco::Net::NotAuthenticatedException& exc)
+ {
+ Log::error("FileServerRequestHandler::NotAuthenticated: " + exc.displayText());
+ response.set("WWW-Authenticate", "Basic realm=\"online\"");
+ response.setStatusAndReason(HTTPResponse::HTTP_UNAUTHORIZED);
+ response.setContentLength(0);
+ response.send();
+ }
+ catch (const Poco::FileAccessDeniedException& exc)
+ {
+ Log::error("FileServerRequestHandler: " + exc.displayText());
+ response.setStatusAndReason(HTTPResponse::HTTP_FORBIDDEN);
+ response.setContentLength(0); // TODO return some 403 page?
+ response.send();
+ }
+ catch (const Poco::FileNotFoundException& exc)
+ {
+ Log::error("FileServerRequestHandler: " + exc.displayText());
+ response.setStatusAndReason(HTTPResponse::HTTP_NOT_FOUND);
+ response.setContentLength(0); // TODO return some 404 page?
+ response.send();
+ }
+}
+
+std::string FileServerRequestHandler::getRequestPathname(const HTTPServerRequest& request)
+{
+ Poco::URI requestUri(request.getURI());
+ // avoid .'s and ..'s
+ requestUri.normalize();
+
+ std::string path(requestUri.getPath());
+
+ // convert version back to a real file name
+ Poco::replaceInPlace(path, std::string("/loleaflet/" LOOLWSD_VERSION_HASH "/"), std::string("/loleaflet/dist/"));
+
+ return path;
+}
+
+void FileServerRequestHandler::preprocessFile(HTTPServerRequest& request, HTTPServerResponse& response) throw(Poco::FileAccessDeniedException)
+{
+ HTMLForm form(request, request.stream());
+
+ const auto host = (LOOLWSD::isSSLEnabled() ? "wss://" : "ws://") + (LOOLWSD::ServerName.empty() ? request.getHost() : LOOLWSD::ServerName);
+ const auto path = Poco::Path(LOOLWSD::FileServerRoot, getRequestPathname(request));
+
+ Log::debug("Preprocessing file: " + path.toString());
+
+ std::string preprocess;
+ FileInputStream file(path.toString());
+ StreamCopier::copyToString(file, preprocess);
+ file.close();
+
+ const std::string& accessToken = form.get("access_token", "");
+ const std::string& accessTokenTtl = form.get("access_token_ttl", "");
+
+ // As of now only alphanumeric characters are allowed in access token
+ // Sanitize user input before replacing
+ Poco::RegularExpression re("[a-zA-Z0-9_]*", Poco::RegularExpression::RE_ANCHORED);
+ if (!re.match(accessToken, 0, 0) || !re.match(accessTokenTtl, 0, 0))
+ {
+ throw Poco::FileAccessDeniedException("Invalid access token provided. Only alphanumeric and _ are allowed ");
+ }
+
+ Poco::replaceInPlace(preprocess, std::string("%ACCESS_TOKEN%"), accessToken);
+ Poco::replaceInPlace(preprocess, std::string("%ACCESS_TOKEN_TTL%"), accessTokenTtl);
+ Poco::replaceInPlace(preprocess, std::string("%HOST%"), host);
+ Poco::replaceInPlace(preprocess, std::string("%VERSION%"), std::string(LOOLWSD_VERSION_HASH));
+
+ response.setContentType("text/html");
+ response.setContentLength(preprocess.length());
+ response.setChunkedTransferEncoding(false);
+
+ std::ostream& ostr = response.send();
+ ostr << preprocess;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/FileServer.hpp b/loolwsd/FileServer.hpp
index 6903b0d..ac8d44d 100644
--- a/loolwsd/FileServer.hpp
+++ b/loolwsd/FileServer.hpp
@@ -15,241 +15,26 @@
#include <string>
#include <vector>
-#include <Poco/FileStream.h>
-#include <Poco/Net/HTTPCookie.h>
-#include <Poco/Net/HTTPBasicCredentials.h>
-#include <Poco/Net/HTMLForm.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPRequestHandler.h>
#include <Poco/Net/HTTPServer.h>
-#include <Poco/Net/HTTPServerParams.h>
#include <Poco/Net/HTTPServerRequest.h>
#include <Poco/Net/HTTPServerResponse.h>
-#include <Poco/Net/NetException.h>
#include <Poco/Net/SecureServerSocket.h>
-#include <Poco/Net/WebSocket.h>
-#include <Poco/RegularExpression.h>
-#include <Poco/Runnable.h>
-#include <Poco/StreamCopier.h>
-#include <Poco/StringTokenizer.h>
-#include <Poco/URI.h>
-#include <Poco/Util/ServerApplication.h>
-#include <Poco/Util/Timer.h>
-#include "Common.hpp"
-#include "LOOLWSD.hpp"
+#include "Log.hpp"
-using Poco::FileInputStream;
-using Poco::Net::HTMLForm;
-using Poco::Net::HTTPRequest;
-using Poco::Net::HTTPRequestHandler;
-using Poco::Net::HTTPRequestHandlerFactory;
-using Poco::Net::HTTPResponse;
-using Poco::Net::HTTPServerParams;
-using Poco::Net::HTTPServerRequest;
-using Poco::Net::HTTPServerResponse;
-using Poco::Net::SecureServerSocket;
-using Poco::Net::HTTPBasicCredentials;
-using Poco::StreamCopier;
-using Poco::Util::Application;
-
-class FileServerRequestHandler: public HTTPRequestHandler
+class FileServerRequestHandler: public Poco::Net::HTTPRequestHandler
{
-public:
-
- /// Evaluate if the cookie exists, and if not, ask for the credentials.
- static bool isAdminLoggedIn(HTTPServerRequest& request, HTTPServerResponse& response)
- {
- const auto& config = Application::instance().config();
- const auto sslKeyPath = config.getString("ssl.key_file_path", "");
-
- if (request.find("Cookie") != request.end())
- {
- // FIXME: Handle other cookie params like '; httponly; secure'
- const std::size_t pos = request["Cookie"].find_first_of("=");
- if (pos == std::string::npos)
- throw Poco::Net::NotAuthenticatedException("Missing JWT");
-
- const std::string jwtToken = request["Cookie"].substr(pos + 1);
- Log::info("Verifying JWT token: " + jwtToken);
- JWTAuth authAgent(sslKeyPath, "admin", "admin", "admin");
- if (authAgent.verify(jwtToken))
- {
- Log::trace("JWT token is valid");
- return true;
- }
-
- Log::info("Invalid JWT token, let the administrator re-login");
- }
-
- const auto user = config.getString("admin_console.username", "");
- const auto pass = config.getString("admin_console.password", "");
- if (user.empty() || pass.empty())
- {
- Log::error("Admin Console credentials missing. Denying access until set.");
- return false;
- }
-
- HTTPBasicCredentials credentials(request);
- if (credentials.getUsername() == user &&
- credentials.getPassword() == pass)
- {
- const std::string htmlMimeType = "text/html";
- // generate and set the cookie
- JWTAuth authAgent(sslKeyPath, "admin", "admin", "admin");
- const std::string jwtToken = authAgent.getAccessToken();
- Poco::Net::HTTPCookie cookie("jwt", jwtToken);
- cookie.setPath("/lool/adminws/");
- cookie.setSecure(true);
- cookie.setHttpOnly(true);
- response.addCookie(cookie);
-
- return true;
- }
-
- Log::info("Wrong admin credentials.");
- return false;
- }
-
- void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) override
- {
- try
- {
- Poco::URI requestUri(request.getURI());
- requestUri.normalize(); // avoid .'s and ..'s
-
- std::vector<std::string> requestSegments;
- requestUri.getPathSegments(requestSegments);
- if (requestSegments.size() < 1)
- {
- throw Poco::FileNotFoundException("Invalid URI request: [" + requestUri.toString() + "].");
- }
-
- const auto& config = Application::instance().config();
- const std::string loleafletHtml = config.getString("loleaflet_html", "loleaflet.html");
- const std::string endPoint = requestSegments[requestSegments.size() - 1];
- if (endPoint == loleafletHtml)
- {
- preprocessFile(request, response);
- return;
- }
-
- if (request.getMethod() == HTTPRequest::HTTP_GET)
- {
- if (endPoint == "admin.html" ||
- endPoint == "adminSettings.html" ||
- endPoint == "adminAnalytics.html")
- {
- if (!FileServerRequestHandler::isAdminLoggedIn(request, response))
- throw Poco::Net::NotAuthenticatedException("Invalid admin login");
- }
-
- const auto path = Poco::Path(LOOLWSD::FileServerRoot, getRequestPathname(request));
- const auto filepath = path.absolute().toString();
- if (filepath.find(LOOLWSD::FileServerRoot) != 0)
- {
- // Accessing unauthorized path.
- throw Poco::FileAccessDeniedException("Invalid or forbidden file path: [" + filepath + "].");
- }
-
- const std::size_t extPoint = endPoint.find_last_of(".");
- if (extPoint == std::string::npos)
- throw Poco::FileNotFoundException("Invalid file.");
+ std::string getRequestPathname(const Poco::Net::HTTPServerRequest& request);
- const std::string fileType = endPoint.substr(extPoint + 1);
- std::string mimeType;
- if (fileType == "js")
- mimeType = "application/javascript";
- else if (fileType == "css")
- mimeType = "text/css";
- else if (fileType == "html")
- mimeType = "text/html";
- else if (fileType == "svg")
- mimeType = "image/svg+xml";
- else
- mimeType = "text/plain";
+ void preprocessFile(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) throw(Poco::FileAccessDeniedException);
- response.setContentType(mimeType);
- response.sendFile(filepath, mimeType);
- }
- }
- catch (const Poco::Net::NotAuthenticatedException& exc)
- {
- Log::error("FileServerRequestHandler::NotAuthenticated: " + exc.displayText());
- response.set("WWW-Authenticate", "Basic realm=\"online\"");
- response.setStatusAndReason(HTTPResponse::HTTP_UNAUTHORIZED);
- response.setContentLength(0);
- response.send();
- }
- catch (const Poco::FileAccessDeniedException& exc)
- {
- Log::error("FileServerRequestHandler: " + exc.displayText());
- response.setStatusAndReason(HTTPResponse::HTTP_FORBIDDEN);
- response.setContentLength(0); // TODO return some 403 page?
- response.send();
- }
- catch (const Poco::FileNotFoundException& exc)
- {
- Log::error("FileServerRequestHandler: " + exc.displayText());
- response.setStatusAndReason(HTTPResponse::HTTP_NOT_FOUND);
- response.setContentLength(0); // TODO return some 404 page?
- response.send();
- }
- }
-
-private:
-
- std::string getRequestPathname(const HTTPServerRequest& request)
- {
- Poco::URI requestUri(request.getURI());
- // avoid .'s and ..'s
- requestUri.normalize();
-
- std::string path(requestUri.getPath());
-
- // convert version back to a real file name
- Poco::replaceInPlace(path, std::string("/loleaflet/" LOOLWSD_VERSION_HASH "/"), std::string("/loleaflet/dist/"));
-
- return path;
- }
-
- void preprocessFile(HTTPServerRequest& request, HTTPServerResponse& response) throw(Poco::FileAccessDeniedException)
- {
- HTMLForm form(request, request.stream());
-
- const auto host = (LOOLWSD::isSSLEnabled() ? "wss://" : "ws://") + (LOOLWSD::ServerName.empty() ? request.getHost() : LOOLWSD::ServerName);
- const auto path = Poco::Path(LOOLWSD::FileServerRoot, getRequestPathname(request));
-
- Log::debug("Preprocessing file: " + path.toString());
-
- std::string preprocess;
- FileInputStream file(path.toString());
- StreamCopier::copyToString(file, preprocess);
- file.close();
-
- const std::string& accessToken = form.get("access_token", "");
- const std::string& accessTokenTtl = form.get("access_token_ttl", "");
-
- // As of now only alphanumeric characters are allowed in access token
- // Sanitize user input before replacing
- Poco::RegularExpression re("[a-zA-Z0-9_]*", Poco::RegularExpression::RE_ANCHORED);
- if (!re.match(accessToken, 0, 0) || !re.match(accessTokenTtl, 0, 0))
- {
- throw Poco::FileAccessDeniedException("Invalid access token provided. Only alphanumeric and _ are allowed ");
- }
-
- Poco::replaceInPlace(preprocess, std::string("%ACCESS_TOKEN%"), accessToken);
- Poco::replaceInPlace(preprocess, std::string("%ACCESS_TOKEN_TTL%"), accessTokenTtl);
- Poco::replaceInPlace(preprocess, std::string("%HOST%"), host);
- Poco::replaceInPlace(preprocess, std::string("%VERSION%"), std::string(LOOLWSD_VERSION_HASH));
-
- response.setContentType("text/html");
- response.setContentLength(preprocess.length());
- response.setChunkedTransferEncoding(false);
+public:
+ /// Evaluate if the cookie exists, and if not, ask for the credentials.
+ static bool isAdminLoggedIn(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
- std::ostream& ostr = response.send();
- ostr << preprocess;
- }
+ void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) override;
};
class FileServer
diff --git a/loolwsd/Makefile.am b/loolwsd/Makefile.am
index 5e7186d..148e9c9 100644
--- a/loolwsd/Makefile.am
+++ b/loolwsd/Makefile.am
@@ -44,6 +44,7 @@ loolwsd_SOURCES = Admin.cpp \
DocumentBroker.cpp \
LOOLWSD.cpp \
ClientSession.cpp \
+ FileServer.cpp \
PrisonerSession.cpp \
Storage.cpp \
TileCache.cpp \
@@ -175,4 +176,3 @@ all-local: loolforkit @JAILS_PATH@ $(SYSTEM_STAMP)
else \
echo "Skipping capability setting"; \
fi
-
commit ff5704a3cf02eed2687a4604ce9a29be79cc3b59
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Tue Jul 19 22:40:14 2016 +0530
loolwsd: Drop forward decl. and add missing include
... instead of including Storage.hpp through some funny inclusion
of header files.
Change-Id: I7b6d63b687ef92c4523c01455172ad9fa08fe14a
diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp
index a589143..1324005 100644
--- a/loolwsd/DocumentBroker.hpp
+++ b/loolwsd/DocumentBroker.hpp
@@ -26,11 +26,11 @@
#include "IoUtil.hpp"
#include "Log.hpp"
+#include "Storage.hpp"
#include "TileCache.hpp"
#include "Util.hpp"
// Forwards.
-class StorageBase;
class DocumentBroker;
/// Represents a new LOK child that is read
commit 478879f1812b22811884acacaca4f475c06aebfe
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Tue Jul 19 22:14:29 2016 +0530
loolwsd: Reorder header files alphabetically
Change-Id: Ic83155ddf596c7d5168ef37721417d211b85313d
diff --git a/loolwsd/Admin.cpp b/loolwsd/Admin.cpp
index 540d36b..952544b 100644
--- a/loolwsd/Admin.cpp
+++ b/loolwsd/Admin.cpp
@@ -7,7 +7,6 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-#include "Admin.hpp"
#include "config.h"
#include <cassert>
@@ -27,6 +26,7 @@
#include <Poco/Util/ServerApplication.h>
#include <Poco/Util/Timer.h>
+#include "Admin.hpp"
#include "AdminModel.hpp"
#include "Auth.hpp"
#include "Common.hpp"
diff --git a/loolwsd/FileServer.hpp b/loolwsd/FileServer.hpp
index 574d0b0..6903b0d 100644
--- a/loolwsd/FileServer.hpp
+++ b/loolwsd/FileServer.hpp
@@ -15,8 +15,7 @@
#include <string>
#include <vector>
-#include <Poco/Net/NetException.h>
-
+#include <Poco/FileStream.h>
#include <Poco/Net/HTTPCookie.h>
#include <Poco/Net/HTTPBasicCredentials.h>
#include <Poco/Net/HTMLForm.h>
@@ -26,20 +25,21 @@
#include <Poco/Net/HTTPServerParams.h>
#include <Poco/Net/HTTPServerRequest.h>
#include <Poco/Net/HTTPServerResponse.h>
+#include <Poco/Net/NetException.h>
#include <Poco/Net/SecureServerSocket.h>
#include <Poco/Net/WebSocket.h>
+#include <Poco/RegularExpression.h>
#include <Poco/Runnable.h>
+#include <Poco/StreamCopier.h>
#include <Poco/StringTokenizer.h>
#include <Poco/URI.h>
-#include <Poco/FileStream.h>
-#include <Poco/RegularExpression.h>
-#include <Poco/StreamCopier.h>
#include <Poco/Util/ServerApplication.h>
#include <Poco/Util/Timer.h>
#include "Common.hpp"
#include "LOOLWSD.hpp"
+using Poco::FileInputStream;
using Poco::Net::HTMLForm;
using Poco::Net::HTTPRequest;
using Poco::Net::HTTPRequestHandler;
@@ -50,7 +50,6 @@ using Poco::Net::HTTPServerRequest;
using Poco::Net::HTTPServerResponse;
using Poco::Net::SecureServerSocket;
using Poco::Net::HTTPBasicCredentials;
-using Poco::FileInputStream;
using Poco::StreamCopier;
using Poco::Util::Application;
commit c94d2b79fbc6c6687f3f5757c3e11082b4a0dbdd
Author: Pranav Kant <pranavk at collabora.co.uk>
Date: Tue Jul 19 22:10:17 2016 +0530
loolwsd: Missing include
Though it still works without it through some other indirect
include. Better explicitly include it.
Change-Id: Ia0783cd1b1116d5269248ff29f7e7239c3826644
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index cbd3fca..3fe3c96 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -69,6 +69,7 @@
#include <Poco/Net/InvalidCertificateHandler.h>
#include <Poco/Net/KeyConsoleHandler.h>
#include <Poco/Net/MessageHeader.h>
+#include <Poco/Net/NameValueCollection.h>
#include <Poco/Net/Net.h>
#include <Poco/Net/NetException.h>
#include <Poco/Net/PartHandler.h>
More information about the Libreoffice-commits
mailing list