[Libreoffice-commits] online.git: loolwsd.xml.in wsd/FileServer.cpp
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Fri Nov 23 15:34:13 UTC 2018
loolwsd.xml.in | 1
wsd/FileServer.cpp | 55 ++++++++++++++++++++++-------------------------------
2 files changed, 24 insertions(+), 32 deletions(-)
New commits:
commit 296aba1beae64a65e4e86631a9c1458073ec8c2e
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Fri Nov 23 09:33:13 2018 +0100
Commit: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Fri Nov 23 16:33:55 2018 +0100
Improve allowed frame-ancestors
Beforehand, any host could embed the iframe as the Referer was always allowed.
Now, only the loolwsd and the WOPI host are allowed to do that.
Additionally, a config option has been added to add more allowed hosts.
X-Frame-Options supports has been removed as it supports only one host
and CSP is meanwhile supported in ~all major browsers.
Change-Id: I222720e1220116102708c50edaf08e2a4a0aebda
Reviewed-on: https://gerrit.libreoffice.org/63864
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Tested-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
diff --git a/loolwsd.xml.in b/loolwsd.xml.in
index 6842a782c..48c053adb 100644
--- a/loolwsd.xml.in
+++ b/loolwsd.xml.in
@@ -79,6 +79,7 @@
<host desc="Ditto, but as IPv4-mapped IPv6 address">::ffff:127\.0\.0\.1</host>
<host desc="The IPv6 loopback (localhost) address.">::1</host>
</post_allow>
+ <frame_ancestors desc="Specify who is allowed to embed the LO Online iframe (loolwsd and WOPI host are always allowed). Separate multiple hosts by space."></frame_ancestors>
</net>
<ssl desc="SSL settings">
diff --git a/wsd/FileServer.cpp b/wsd/FileServer.cpp
index 0129070eb..651654364 100644
--- a/wsd/FileServer.cpp
+++ b/wsd/FileServer.cpp
@@ -681,50 +681,41 @@ void FileServerRequestHandler::preprocessFile(const HTTPRequest& request, Poco::
<< "font-src 'self' data:; "
<< "object-src blob:; ";
- std::string frameAncestor;
- const auto it = request.find("Referer"); // Referer[sic]
- if (it != request.end())
+ // Frame ancestors: Allow loolwsd host, wopi host and anything configured.
+ std::string configFrameAncestor = config.getString("net.frame_ancestors", "");
+ std::string frameAncestors = configFrameAncestor;
+ Poco::URI uriHost(host);
+ if (uriHost.getHost() != configFrameAncestor)
+ frameAncestors += " " + uriHost.getHost();
+
+ for (const auto& param : params)
{
- frameAncestor = it->second;
- LOG_TRC("Picking frame ancestor from HTTP Referer header: " << frameAncestor);
- }
- else // Use WOPISrc value if Referer is absent
- {
- for (const auto& param : params)
+ if (param.first == "WOPISrc")
{
- if (param.first == "WOPISrc")
+ std::string wopiFrameAncestor;
+ Poco::URI::decode(param.second, wopiFrameAncestor);
+ if (wopiFrameAncestor != uriHost.getHost() && wopiFrameAncestor != configFrameAncestor)
{
- Poco::URI::decode(param.second, frameAncestor);
- LOG_TRC("Picking frame ancestor from WOPISrc: " << frameAncestor);
- break;
+ frameAncestors += " " + wopiFrameAncestor;
+ LOG_TRC("Picking frame ancestor from WOPISrc: " << wopiFrameAncestor);
}
+ break;
}
}
- // Keep only the origin, reject everything else
- Poco::URI uriFrameAncestor(frameAncestor);
- const std::string& frameAncestorScheme = uriFrameAncestor.getScheme();
- const std::string& frameAncestorHost = uriFrameAncestor.getHost();
-
- if (!frameAncestor.empty() && Util::isValidURIScheme(frameAncestorScheme) && Util::isValidURIHost(frameAncestorHost))
+ if (!frameAncestors.empty())
{
- frameAncestor = frameAncestorScheme + "://" + frameAncestorHost + ":" + std::to_string(uriFrameAncestor.getPort());
-
- LOG_TRC("Final frame ancestor: " << frameAncestor);
-
- // Replaced by frame-ancestors in CSP but some oldies don't know about that
- oss << "X-Frame-Options: allow-from " << frameAncestor << "\r\n";
- cspOss << "img-src 'self' data: " << frameAncestor << "; "
- << "frame-ancestors " << frameAncestor;
+ LOG_TRC("Allowed frame ancestors: " << frameAncestors);
+ // X-Frame-Options supports only one ancestor, ignore that
+ //(it's deprecated anyway and CSP works in all major browsers)
+ cspOss << "img-src 'self' data: " << frameAncestors << "; "
+ << "frame-ancestors " << frameAncestors;
}
else
{
- LOG_TRC("Denied frame ancestor: " << frameAncestor);
-
- cspOss << "img-src 'self' data: ;";
- oss << "X-Frame-Options: deny\r\n";
+ LOG_TRC("Denied all frame ancestors");
+ cspOss << "img-src 'self' data: none;";
}
-
cspOss << "\r\n";
// Append CSP to response headers too
oss << cspOss.str();
More information about the Libreoffice-commits
mailing list