[Libreoffice-commits] online.git: 3 commits - net/ServerSocket.hpp test/httpwstest.cpp wsd/LOOLWSD.cpp
Michael Meeks
michael.meeks at collabora.com
Mon May 14 11:09:41 UTC 2018
net/ServerSocket.hpp | 20 +++++++++++-
test/httpwstest.cpp | 3 +
wsd/LOOLWSD.cpp | 80 ++++++++++++++++++++++++++++-----------------------
3 files changed, 64 insertions(+), 39 deletions(-)
New commits:
commit 41238c5d1a9fa3f26f66252736f7986e83c389a9
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Sun May 13 13:35:32 2018 +0100
Restrict convert-to to known hosts - not all insert / downloads.
Change-Id: Ief26c80bf7e9e96f3c5dce0d8739a825f6fac629
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 9f4e56405..7004cf795 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -1728,6 +1728,33 @@ public:
StaticFileContentCache["discovery.xml"] = getDiscoveryXML();
}
+ /// Does this address feature in the allowed hosts list.
+ bool allowPostFrom(const std::string &address)
+ {
+ static bool init = false;
+ static Util::RegexListMatcher hosts;
+ if (!init)
+ {
+ const auto& app = Poco::Util::Application::instance();
+ // Parse the host allow settings.
+ for (size_t i = 0; ; ++i)
+ {
+ const std::string path = "post_allow.host[" + std::to_string(i) + "]";
+ const auto host = app.config().getString(path, "");
+ if (!host.empty())
+ {
+ LOG_INF("Adding trusted POST_ALLOW host: [" << host << "].");
+ hosts.allow(host);
+ }
+ else if (!app.config().has(path))
+ {
+ break;
+ }
+ }
+ }
+ return hosts.match(address);
+ }
+
private:
/// Set the socket associated with this ResponseClient.
@@ -1805,42 +1832,8 @@ private:
if (!(request.find("Upgrade") != request.end() && Poco::icompare(request["Upgrade"], "websocket") == 0) &&
reqPathTokens.count() > 0 && reqPathTokens[0] == "lool")
{
- // allow/deny for POST
- const auto& app = Poco::Util::Application::instance();
- Util::RegexListMatcher hosts;
- // Parse the host allow settings.
- for (size_t i = 0; ; ++i)
- {
- const std::string path = "post_allow.host[" + std::to_string(i) + "]";
- const auto host = app.config().getString(path, "");
- if (!host.empty())
- {
- LOG_INF("Adding trusted POST_ALLOW host: [" << host << "].");
- hosts.allow(host);
- }
- else if (!app.config().has(path))
- {
- break;
- }
- }
- if (!hosts.match(socket->clientAddress()))
- {
- LOG_ERR("client address DENY: " << socket->clientAddress().c_str());
-
- std::ostringstream oss;
- oss << "HTTP/1.1 403\r\n"
- << "Date: " << Poco::DateTimeFormatter::format(Poco::Timestamp(), Poco::DateTimeFormat::HTTP_FORMAT) << "\r\n"
- << "User-Agent: " << HTTP_AGENT_STRING << "\r\n"
- << "Content-Length: 0\r\n"
- << "\r\n";
- socket->send(oss.str());
- socket->shutdown();
- }
- else
- {
- // All post requests have url prefix 'lool'.
- handlePostRequest(request, message, disposition);
- }
+ // All post requests have url prefix 'lool'.
+ handlePostRequest(request, message, disposition);
}
else if (reqPathTokens.count() > 2 && reqPathTokens[0] == "lool" && reqPathTokens[2] == "ws" &&
request.find("Upgrade") != request.end() && Poco::icompare(request["Upgrade"], "websocket") == 0)
@@ -2036,6 +2029,21 @@ private:
std::string format = (form.has("format") ? form.get("format") : "");
+ if (!allowPostFrom(socket->clientAddress()))
+ {
+ LOG_ERR("client address DENY: " << socket->clientAddress().c_str());
+
+ std::ostringstream oss;
+ oss << "HTTP/1.1 403\r\n"
+ << "Date: " << Poco::DateTimeFormatter::format(Poco::Timestamp(), Poco::DateTimeFormat::HTTP_FORMAT) << "\r\n"
+ << "User-Agent: " << HTTP_AGENT_STRING << "\r\n"
+ << "Content-Length: 0\r\n"
+ << "\r\n";
+ socket->send(oss.str());
+ socket->shutdown();
+ return;
+ }
+
// prefer what is in the URI
if (tokens.count() > 3)
format = tokens[3];
commit 98bb6f420b06ef4cc379481e549eca15fd17fa92
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Sun May 13 13:05:10 2018 +0100
Make slideshow unit test more verbose.
Change-Id: I8c9764d86962e93155421ce47f48689eb826533a
diff --git a/test/httpwstest.cpp b/test/httpwstest.cpp
index 45a424956..eb233f951 100644
--- a/test/httpwstest.cpp
+++ b/test/httpwstest.cpp
@@ -1279,11 +1279,12 @@ void HTTPWSTest::testSlideShow()
const std::string path = "/lool/" + encodedDoc + "/" + jail + "/" + dir + "/" + name;
std::unique_ptr<Poco::Net::HTTPClientSession> session(helpers::createSession(_uri));
Poco::Net::HTTPRequest requestSVG(Poco::Net::HTTPRequest::HTTP_GET, path);
+ TST_LOG("Requesting SVG from " << path);
session->sendRequest(requestSVG);
Poco::Net::HTTPResponse responseSVG;
std::istream& rs = session->receiveResponse(responseSVG);
- CPPUNIT_ASSERT_EQUAL(Poco::Net::HTTPResponse::HTTP_OK, responseSVG.getStatus());
+ CPPUNIT_ASSERT_EQUAL(Poco::Net::HTTPResponse::HTTP_OK /* 200 */, responseSVG.getStatus());
CPPUNIT_ASSERT_EQUAL(std::string("image/svg+xml"), responseSVG.getContentType());
TST_LOG("SVG file size: " << responseSVG.getContentLength());
commit adb3112820bd64e70919917203e9ca7ac16e7b99
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Sun May 13 12:32:05 2018 +0100
Use inet_ntop for ipv6 address names.
Change-Id: Ic52b69eb2dc86b6532a78d770531b2fac928fb28
diff --git a/net/ServerSocket.hpp b/net/ServerSocket.hpp
index abc018678..afd4b97f4 100644
--- a/net/ServerSocket.hpp
+++ b/net/ServerSocket.hpp
@@ -70,9 +70,25 @@ public:
// Create a socket object using the factory.
if (rc != -1)
{
- std::string ip = inet_ntoa(clientInfo.sin_addr);
+ char addrstr[INET6_ADDRSTRLEN];
+
+ const void *inAddr;
+ if (clientInfo.sin_family == AF_INET)
+ {
+ auto ipv4 = (struct sockaddr_in *)&clientInfo.sin_addr;
+ inAddr = &(ipv4->sin_addr);
+ }
+ else
+ {
+ auto ipv6 = (struct sockaddr_in6 *)&clientInfo.sin_addr;
+ inAddr = &(ipv6->sin6_addr);
+ }
+
+ inet_ntop(clientInfo.sin_family, inAddr, addrstr, sizeof(addrstr));
std::shared_ptr<Socket> _socket = _sockFactory->create(rc);
- _socket->_clientAddress = ip;
+ _socket->_clientAddress = addrstr;
+ LOG_DBG("Accepted socket has family " << clientInfo.sin_family <<
+ " address " << _socket->_clientAddress);
return _socket;
}
return std::shared_ptr<Socket>(nullptr);
More information about the Libreoffice-commits
mailing list