[Libreoffice-commits] online.git: 5 commits - loleaflet/build loleaflet/dist loolwsd/Admin.cpp loolwsd/cert.pem loolwsd/Common.hpp loolwsd/configure.ac loolwsd/FileServer.hpp loolwsd/key.pem loolwsd/LOOLWSD.cpp loolwsd/LOOLWSD.hpp
Tor Lillqvist
tml at collabora.com
Mon Mar 21 14:54:31 UTC 2016
loleaflet/build/build.js | 2
loleaflet/dist/admin.html | 128 +++++
loleaflet/dist/admin/admin-src.js | 710 -------------------------------
loleaflet/dist/admin/admin.html | 129 -----
loleaflet/dist/admin/adminAnalytics.html | 100 ----
loleaflet/dist/admin/adminSettings.html | 107 ----
loolwsd/Admin.cpp | 113 ----
loolwsd/Common.hpp | 2
loolwsd/FileServer.hpp | 153 ------
loolwsd/LOOLWSD.cpp | 40 -
loolwsd/LOOLWSD.hpp | 1
loolwsd/cert.pem | 24 -
loolwsd/configure.ac | 2
loolwsd/key.pem | 27 -
14 files changed, 150 insertions(+), 1388 deletions(-)
New commits:
commit 9a66e75e8348ac1844f2e187c65e3f1eb7c233b9
Author: Tor Lillqvist <tml at collabora.com>
Date: Mon Mar 21 16:52:55 2016 +0200
Revert "loolwsd: SSL infrastructure"
This reverts commit fb9c9a9ec7833e290833e1133780ac4b39a92bf7.
diff --git a/loolwsd/Common.hpp b/loolwsd/Common.hpp
index fd7ee55..053ce94 100644
--- a/loolwsd/Common.hpp
+++ b/loolwsd/Common.hpp
@@ -37,8 +37,6 @@ constexpr int SMALL_MESSAGE_SIZE = READ_BUFFER_SIZE / 2;
static const std::string JailedDocumentRoot = "/user/docs/";
static const std::string CHILD_URI = "/loolws/child?";
static const std::string LOLEAFLET_PATH = "/loleaflet/dist/loleaflet.html?";
-static const std::string SSL_CERT_FILE = "cert.pem";
-static const std::string SSL_KEY_FILE = "key.pem";
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index ba30f41..2c47456 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -62,8 +62,6 @@ DEALINGS IN THE SOFTWARE.
#include <Poco/File.h>
#include <Poco/FileStream.h>
#include <Poco/Mutex.h>
-#include <Poco/Net/ConsoleCertificateHandler.h>
-#include <Poco/Net/Context.h>
#include <Poco/Net/HTMLForm.h>
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
@@ -74,17 +72,12 @@ DEALINGS IN THE SOFTWARE.
#include <Poco/Net/HTTPServerParams.h>
#include <Poco/Net/HTTPServerRequest.h>
#include <Poco/Net/HTTPServerResponse.h>
-#include <Poco/Net/InvalidCertificateHandler.h>
-#include <Poco/Net/KeyConsoleHandler.h>
#include <Poco/Net/MessageHeader.h>
#include <Poco/Net/Net.h>
#include <Poco/Net/NetException.h>
#include <Poco/Net/PartHandler.h>
-#include <Poco/Net/PrivateKeyPassphraseHandler.h>
-#include <Poco/Net/SecureServerSocket.h>
#include <Poco/Net/ServerSocket.h>
#include <Poco/Net/SocketAddress.h>
-#include <Poco/Net/SSLManager.h>
#include <Poco/Net/WebSocket.h>
#include <Poco/Path.h>
#include <Poco/Process.h>
@@ -137,7 +130,6 @@ using Poco::Net::HTTPServerResponse;
using Poco::Net::MessageHeader;
using Poco::Net::NameValueCollection;
using Poco::Net::PartHandler;
-using Poco::Net::SecureServerSocket;
using Poco::Net::ServerSocket;
using Poco::Net::Socket;
using Poco::Net::SocketAddress;
@@ -1096,22 +1088,6 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
return Application::EXIT_USAGE;
}
- Poco::Crypto::initializeCrypto();
-
- // SSL initialize
- Poco::Net::initializeSSL();
- Poco::Net::Context::Params sslParams;
- sslParams.certificateFile = Path(Application::instance().commandPath()).parent().toString() + SSL_CERT_FILE;
- sslParams.privateKeyFile = Path(Application::instance().commandPath()).parent().toString() + SSL_KEY_FILE;
- // Don't ask clients for certificate
- sslParams.verificationMode = Poco::Net::Context::VERIFY_NONE;
-
- Poco::SharedPtr<Poco::Net::PrivateKeyPassphraseHandler> consoleHandler = new Poco::Net::KeyConsoleHandler(true);
- Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> invalidCertHandler = new Poco::Net::ConsoleCertificateHandler(false);
-
- Poco::Net::Context::Ptr sslContext = new Poco::Net::Context(Poco::Net::Context::SERVER_USE, sslParams);
- Poco::Net::SSLManager::instance().initializeServer(consoleHandler, invalidCertHandler, sslContext);
-
char *locale = setlocale(LC_ALL, nullptr);
if (locale == nullptr || std::strcmp(locale, "C") == 0)
setlocale(LC_ALL, "en_US.utf8");
@@ -1217,7 +1193,7 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
params2->setMaxThreads(MAX_SESSIONS);
// Start a server listening on the port for clients
- SecureServerSocket svs(ClientPortNumber);
+ ServerSocket svs(ClientPortNumber);
ThreadPool threadPool(NumPreSpawnedChildren*6, MAX_SESSIONS * 2);
HTTPServer srv(new RequestHandlerFactory<ClientRequestHandler>(), threadPool, svs, params1);
@@ -1350,9 +1326,6 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
Util::removeFile(path, true);
}
- Poco::Net::uninitializeSSL();
- Poco::Crypto::uninitializeCrypto();
-
Log::info("Process [loolwsd] finished.");
return Application::EXIT_OK;
}
diff --git a/loolwsd/cert.pem b/loolwsd/cert.pem
deleted file mode 100644
index 8573263..0000000
--- a/loolwsd/cert.pem
+++ /dev/null
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIECzCCAvOgAwIBAgIJAODbP0OufIfRMA0GCSqGSIb3DQEBCwUAMIGbMQswCQYD
-VQQGEwJJTjETMBEGA1UECAwKQ2hhbmRpZ2FyaDETMBEGA1UEBwwKQ2hhbmRpZ2Fy
-aDESMBAGA1UECgwJQ29sbGFib3JhMRIwEAYDVQQLDAlDb2xsYWJvcmExEjAQBgNV
-BAMMCWxvY2FsaG9zdDEmMCQGCSqGSIb3DQEJARYXcHJhbmF2a0Bjb2xsYWJvcmEu
-Y28udWswHhcNMTYwMzE3MTkyOTUwWhcNMTcwMzE3MTkyOTUwWjCBmzELMAkGA1UE
-BhMCSU4xEzARBgNVBAgMCkNoYW5kaWdhcmgxEzARBgNVBAcMCkNoYW5kaWdhcmgx
-EjAQBgNVBAoMCUNvbGxhYm9yYTESMBAGA1UECwwJQ29sbGFib3JhMRIwEAYDVQQD
-DAlsb2NhbGhvc3QxJjAkBgkqhkiG9w0BCQEWF3ByYW5hdmtAY29sbGFib3JhLmNv
-LnVrMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAurOVgcqAuIeXIySR
-vc2ZBUrliOd4uUxjIXaKv6SJKucnYON9tLqFtfvbHr6dRN8ii2rtVzSt4xGmL7y/
-tt6g+Bw9J2vz94pr6fK8HsSO4SCEegCDqUlcjYL8lNo64ko+tXEDyyAP6U44wY0o
-QSxSBabFf/r2hnquMIkhA1rBdwlL7dUi6lj1CBP/RRIamo3xu5Jnr28brd4eDrFT
-Ozd/smZFsYXJttXIVIogBFeedQJwXzhlFOfW2U/6lDUdmS8elcTy5Q53m/AYm2SI
-t17H6hJtKulxme/9u2vuZyEsUQZKH7h4eM7vn+ycOyhC7Us6w8h1I4E/lQ2KpHCG
-avnNgQIDAQABo1AwTjAdBgNVHQ4EFgQUTv8kVhooEjV+xmMv9XK2dVMcvfQwHwYD
-VR0jBBgwFoAUTv8kVhooEjV+xmMv9XK2dVMcvfQwDAYDVR0TBAUwAwEB/zANBgkq
-hkiG9w0BAQsFAAOCAQEAKWMHIRErOd/N0OB9HXYiFOht5FB0G7lcxVi2/xuQZ7+a
-fE35J2PPnKh4T9ZJRNfVR9hLUiW4/PUol28R+199OTn0mmDvvBv+39qJCS/GW/+f
-h7S1xE0xEGe5Mhur9TZA2XFNinp+TaQhS6/cmSKa+Mmhh8eHEezycjTR9+xERass
-e8ksYDDzUbcSF/z6iZxy8ISjx1ShIzARdu0wLO91TiDW5HFy1wDWRxuoEZsJvMwc
-aYHZmL1TneKm2zsHbEa8RKszhVu2RkgKUfbfHuWNgxisLe0zR9s0j9UZsbmBt235
-H4uIDQovurvlm5aiLPIUTEnRN1dCF0n7k9KQQslZmA==
------END CERTIFICATE-----
diff --git a/loolwsd/configure.ac b/loolwsd/configure.ac
index f4993e9..f903f57 100644
--- a/loolwsd/configure.ac
+++ b/loolwsd/configure.ac
@@ -119,7 +119,7 @@ AS_IF([test `uname -s` = Linux],
AS_IF([test "$enable_tests" != "no"],
[PKG_CHECK_MODULES([CPPUNIT], [cppunit])])
-LIBS="$LIBS -lPocoNet${POCO_DEBUG_SUFFIX} -lPocoUtil${POCO_DEBUG_SUFFIX} -lPocoJSON${POCO_DEBUG_SUFFIX} -lPocoFoundation${POCO_DEBUG_SUFFIX} -lPocoXML${POCO_DEBUG_SUFFIX} -lPocoNetSSL${POCO_DEBUG_SUFFIX} -lPocoCrypto${POCO_DEBUG_SUFFIX}"
+LIBS="$LIBS -lPocoNet${POCO_DEBUG_SUFFIX} -lPocoUtil${POCO_DEBUG_SUFFIX} -lPocoJSON${POCO_DEBUG_SUFFIX} -lPocoFoundation${POCO_DEBUG_SUFFIX} -lPocoXML${POCO_DEBUG_SUFFIX}"
AC_CHECK_HEADERS([LibreOfficeKit/LibreOfficeKit.h],
[],
diff --git a/loolwsd/key.pem b/loolwsd/key.pem
deleted file mode 100644
index ddcfd07..0000000
--- a/loolwsd/key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpQIBAAKCAQEAurOVgcqAuIeXIySRvc2ZBUrliOd4uUxjIXaKv6SJKucnYON9
-tLqFtfvbHr6dRN8ii2rtVzSt4xGmL7y/tt6g+Bw9J2vz94pr6fK8HsSO4SCEegCD
-qUlcjYL8lNo64ko+tXEDyyAP6U44wY0oQSxSBabFf/r2hnquMIkhA1rBdwlL7dUi
-6lj1CBP/RRIamo3xu5Jnr28brd4eDrFTOzd/smZFsYXJttXIVIogBFeedQJwXzhl
-FOfW2U/6lDUdmS8elcTy5Q53m/AYm2SIt17H6hJtKulxme/9u2vuZyEsUQZKH7h4
-eM7vn+ycOyhC7Us6w8h1I4E/lQ2KpHCGavnNgQIDAQABAoIBAQCKDL3w4ZZ6W6/y
-iVjGep66Hh5JM7a9dPEbzjZb7EKMma0xZCUQHJc/8AGe4x0QztkRM7hZMhedffBe
-/fbYNhfaPa8uVhFoKU8QBq75JSfs6Qlr2LOB2j/4VzGCsza1Gmbx7KX8bTG2tmMb
-Is/wGOBxU1ZYAm6FE3N3af4iJ9pDtDTHggY+mq7g4VyKOpTcp2j/r970sh9vq1Es
-+FyTWsTEx47Ar0X7/n4xb/cVyNQQh/78uDZZ3o1pnTUDtKH7VD8gFWuNdG9Vase3
-xUSwXuAvTBmxip5TrTjSnuhsLPWYqulwy89P+zsDHbBLZMW5Xl3Vpwq2J1AzmwuW
-LJewDO4tAoGBAOxkvL+KUHa0/eapx9iBM2hd/MZYCYVGfRm1IBdeIKuE/ITKHF2v
-2fo6GPaOfZibtSCbeMwwhnsuZ7Efz2qAPzla9is4gK3bJYiFT5fVDlyoDUdA4+Nr
-3mBH4aoBRXrEsektjdSpryFydmMb8reJ0J/cKJ4n083yIMjSv5bAwiW/AoGBAMov
-wNkSrWIqBuk83UdLzD7qENqT5S1qCvXyiKFqrWozgfulyIJXKebmtOKI2rnsG8bz
-puZSaUvx79UvhZKOMtTjYoK1IMB7hxRVV/YsjkyIONHCwhbYSJXcWkRsgdmSn8Db
-Zs4oQMfflC4IaH3I2w7EdRLOAI0g7eRTRxclMVy/AoGBAI0TBU1ttt1Q4CFy+y/q
-0woa5QpdabkeuvPHkxI++1JA+A4rK8iBdJ2PZGxn1u5nJi4CepGo9+i1Ze5fpIHT
-bWfGMBjVDH40xW522GwtGvgS1nHKePW03y4oV7UEMzmz/tTAed8LMNfOHnbBLBV6
-aoWsdpUEAbPrJsOSegH2oSazAoGAAm5Yj0OeOhPvSVamAnly1z7RPQ+SLd2cjCCC
-bA5wT1qXMYNoychqhJA5lI+4sYuZOecsFpDfGz6pd5K+tGhpTA3/3Tp4Tlgt45yz
-Fg6rF1h79mm1E7k+Bi9EFpaHaSpOKW956Piq7rxNd9A6EWkc2Sybi8JWV1wSADDQ
-JgMYeNkCgYEAo0bpz8e+ZMTs3acnOwn8xT0tY9Q57hjTJfftZLjugyh9Y/6T85CR
-Wcpyq6HfEFWKImgM9XJllCqCH9JgXs/IouH0N3B2zG1ySKCK4qVimd+RJPNcn1Nf
-Pda7R2pJuvGglIBJi9EFNHGkUzF74ptru5Hins/+EVDpIRyl6ZJTfUg=
------END RSA PRIVATE KEY-----
commit 1ba4d27aba94f7f6a7acc79ea2a1360daa2bd229
Author: Tor Lillqvist <tml at collabora.com>
Date: Mon Mar 21 16:52:54 2016 +0200
Revert "loolwsd: FileServer class to serve static contents"
This reverts commit 8f435d6e7eabbbfb72b338a7da13b0a63d4709be.
diff --git a/loolwsd/FileServer.hpp b/loolwsd/FileServer.hpp
deleted file mode 100644
index 9c62e41..0000000
--- a/loolwsd/FileServer.hpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/* -*- 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_FILE_SERVER_HPP
-#define INCLUDED_FILE_SERVER_HPP
-
-#include <string>
-#include <vector>
-
-#include <Poco/Net/NetException.h>
-
-#include <Poco/Net/HTTPCookie.h>
-#include <Poco/Net/HTTPBasicCredentials.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/SecureServerSocket.h>
-#include <Poco/Net/WebSocket.h>
-#include <Poco/Runnable.h>
-#include <Poco/StringTokenizer.h>
-#include <Poco/URI.h>
-#include <Poco/Util/ServerApplication.h>
-#include <Poco/Util/Timer.h>
-
-#include "Common.hpp"
-
-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::Util::Application;
-
-class FileServerRequestHandler: public HTTPRequestHandler
-{
-public:
- void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) override
- {
- try
- {
- Poco::URI requestUri(request.getURI());
- std::vector<std::string> requestSegments;
- requestUri.getPathSegments(requestSegments);
-
- // FIXME: We might want to package all dist files from leaflet to some other dir (?)
- const std::string loleafletPath = Poco::Path(Application::instance().commandPath()).parent().parent().toString() + "loleaflet";
- const std::string endPoint = requestSegments[requestSegments.size() - 1];
-
- if (request.getMethod() == HTTPRequest::HTTP_GET)
- {
- // FIXME: Some nice way to ask for credentials for protected files
- if (endPoint == "admin.html" ||
- endPoint == "adminSettings.html" ||
- endPoint == "adminAnalytics.html")
- {
- HTTPBasicCredentials credentials(request);
- // TODO: Read username and password from config file
- if (credentials.getUsername() == "admin"
- && credentials.getPassword() == "admin")
- {
- const std::string htmlMimeType = "text/html";
- // generate and set the cookie
- const std::string keyPath = Poco::Path(Application::instance().commandPath()).parent().toString() + SSL_KEY_FILE;
- JWTAuth authAgent(keyPath, "admin", "admin", "admin");
- const std::string jwtToken = authAgent.getAccessToken();
- Poco::Net::HTTPCookie cookie("jwt", jwtToken);
- response.addCookie(cookie);
- response.setContentType(htmlMimeType);
- response.sendFile(loleafletPath + "/debug/document/" + endPoint, htmlMimeType);
- }
- else
- {
- Log::info("Wrong admin credentials.");
- throw Poco::Net::NotAuthenticatedException("Wrong credentials.");
- }
- }
- else if (requestSegments.size() > 1 && requestSegments[0] == "dist")
- {
- const std::string filePath = requestUri.getPath();
- const std::size_t extPoint = endPoint.find_last_of(".");
- if (extPoint == std::string::npos)
- return;
-
- 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
- mimeType = "text/plain";
-
- response.setContentType(mimeType);
- response.sendFile(loleafletPath + request.getURI(), mimeType);
- }
- else
- {
- throw Poco::FileNotFoundException("");
- }
- }
- }
- catch (Poco::Net::NotAuthenticatedException& exc)
- {
- Log::info ("FileServerRequestHandler::NotAuthenticated");
- response.set("WWW-Authenticate", "Basic realm=\"online\"");
- response.setStatus(HTTPResponse::HTTP_UNAUTHORIZED);
- response.setContentLength(0);
- response.send();
- }
- catch (Poco::FileNotFoundException& exc)
- {
- Log::info("FileServerRequestHandler:: File " + request.getURI() + " not found.");
- response.setStatus(HTTPResponse::HTTP_NOT_FOUND);
- response.setContentLength(0);
- response.send();
- }
- }
-};
-
-class FileServer
-{
-public:
- FileServer()
- {
- Log::info("File server ctor.");
- }
-
- ~FileServer()
- {
- Log::info("File Server dtor.");
- }
-
- FileServerRequestHandler* createRequestHandler()
- {
- return new FileServerRequestHandler();
- }
-};
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 3ccce7d4ca80859cbf3c1cfd501d235a54b87c55
Author: Tor Lillqvist <tml at collabora.com>
Date: Mon Mar 21 16:52:53 2016 +0200
Revert "loolwsd: Use JWT authentication to access admin console"
This reverts commit a0d3c5f3e4dc26790ec72ce434cb664ad302e7b7.
diff --git a/loolwsd/Admin.cpp b/loolwsd/Admin.cpp
index 0bf1718..a1c11cc 100644
--- a/loolwsd/Admin.cpp
+++ b/loolwsd/Admin.cpp
@@ -12,21 +12,15 @@
#include <sys/poll.h>
#include <sys/prctl.h>
-#include <Poco/Net/HTTPCookie.h>
-#include <Poco/Net/HTTPBasicCredentials.h>
-#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPRequestHandler.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/StringTokenizer.h>
-#include <Poco/Util/ServerApplication.h>
#include <Poco/Util/Timer.h>
-#include "Auth.hpp"
#include "Admin.hpp"
#include "AdminModel.hpp"
#include "Common.hpp"
@@ -36,31 +30,41 @@
using namespace LOOLProtocol;
-using Poco::StringTokenizer;
-using Poco::Net::HTTPBasicCredentials;
-using Poco::Net::HTTPCookie;
-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::ServerSocket;
using Poco::Net::Socket;
using Poco::Net::WebSocket;
using Poco::Net::WebSocketException;
-using Poco::Util::Application;
+using Poco::StringTokenizer;
/// Handle admin requests.
class AdminRequestHandler: public HTTPRequestHandler
{
-private:
- void handleWSRequests(HTTPServerRequest& request, HTTPServerResponse& response, int nSessionId)
+public:
+
+ AdminRequestHandler(Admin* adminManager)
+ : _admin(adminManager)
+ { }
+
+ void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) override
{
+ assert(request.serverAddress().port() == ADMIN_PORT_NUMBER);
+
+ // Different session id pool for admin sessions (?)
+ const auto nSessionId = Util::decodeId(LOOLWSD::GenSessionId());
+ const std::string thread_name = "admin_ws_" + std::to_string(nSessionId);
try
{
+ if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0)
+ Log::error("Cannot set thread name to " + thread_name + ".");
+
+ Log::debug("Thread [" + thread_name + "] started.");
+
auto ws = std::make_shared<WebSocket>(request, response);
{
@@ -309,90 +313,11 @@ private:
break;
}
}
- catch (const Poco::Net::NotAuthenticatedException& exc)
- {
- Log::info("NotAuthenticatedException");
- response.set("WWW-Authenticate", "Basic realm=\"ws-online\"");
- response.setStatus(HTTPResponse::HTTP_UNAUTHORIZED);
- response.setContentLength(0);
- response.send();
- }
catch (const std::exception& exc)
{
Log::error(std::string("AdminRequestHandler::handleRequest: Exception: ") + exc.what());
}
- }
-
-public:
-
- AdminRequestHandler(Admin* adminManager)
- : _admin(adminManager)
- { }
-
- void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) override
- {
- assert(request.serverAddress().port() == ADMIN_PORT_NUMBER);
-
- // Different session id pool for admin sessions (?)
- const auto nSessionId = Util::decodeId(LOOLWSD::GenSessionId());
- const std::string thread_name = "admin_ws_" + std::to_string(nSessionId);
-
- if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0)
- Log::error("Cannot set thread name to " + thread_name + ".");
- Log::debug("Thread [" + thread_name + "] started.");
-
- try
- {
- std::string requestURI = request.getURI();
- StringTokenizer pathTokens(requestURI, "/", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-
- if (request.find("Upgrade") != request.end() && Poco::icompare(request["Upgrade"], "websocket") == 0)
- {
- 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);
- const std::string keyPath = Poco::Path(Application::instance().commandPath()).parent().toString() + SSL_KEY_FILE;
- JWTAuth authAgent(keyPath, "admin", "admin", "admin");
- if (authAgent.verify(jwtToken))
- {
- Log::trace("JWT token is valid");
- handleWSRequests(request, response, nSessionId);
- }
- else
- {
- Log::info("Invalid JWT token");
- throw Poco::Net::NotAuthenticatedException("Invalid Token");
- }
- }
- else
- {
- Log::info("Missing authentication cookie. Handshake declined.");
- throw Poco::Net::NotAuthenticatedException("Missing token");
- }
- }
- }
- catch(const Poco::Net::NotAuthenticatedException& exc)
- {
- Log::info("Admin::NotAuthneticated");
- response.set("WWW-Authenticate", "Basic realm=\"online\"");
- response.setStatus(HTTPResponse::HTTP_UNAUTHORIZED);
- response.setContentLength(0);
- response.send();
- }
- catch (const std::exception& exc)
- {
- Log::info("Unknown Exception caught");
- response.setStatusAndReason(HTTPResponse::HTTP_BAD_REQUEST);
- response.setContentLength(0);
- response.send();
- }
Log::debug("Thread [" + thread_name + "] finished.");
}
@@ -430,7 +355,7 @@ private:
/// An admin command processor.
Admin::Admin(const Poco::Process::PID brokerPid, const int brokerPipe, const int notifyPipe) :
- _srv(new AdminRequestHandlerFactory(this), SecureServerSocket(ADMIN_PORT_NUMBER), new HTTPServerParams),
+ _srv(new AdminRequestHandlerFactory(this), ServerSocket(ADMIN_PORT_NUMBER), new HTTPServerParams),
_model(AdminModel())
{
Admin::BrokerPid = brokerPid;
commit e41be7c0f4fe00a4e2dc3d9e4ac347612e2b5cfe
Author: Tor Lillqvist <tml at collabora.com>
Date: Mon Mar 21 16:52:52 2016 +0200
Revert "loleaflet: Move admin console related files to dist/admin"
This reverts commit 3a09c992f71f5dfee12386f289c520737c224436.
diff --git a/loleaflet/build/build.js b/loleaflet/build/build.js
index bf41ee2..db7e536 100644
--- a/loleaflet/build/build.js
+++ b/loleaflet/build/build.js
@@ -121,7 +121,7 @@ exports.build = function (callback, version, compsBase32, buildName) {
// Also combine and copy the admin JS files
// TODO: Also minify if admin complexity increases in future
var adminNewSrc = combineFiles(getAdminFiles()),
- adminPath = 'dist/admin/admin-src.js',
+ adminPath = 'dist/admin-src.js',
adminOldSrc = loadSilently(adminPath);
if (adminNewSrc != adminOldSrc) {
diff --git a/loleaflet/dist/admin/admin.html b/loleaflet/dist/admin.html
similarity index 50%
rename from loleaflet/dist/admin/admin.html
rename to loleaflet/dist/admin.html
index 647b31b..806d54d 100644
--- a/loleaflet/dist/admin/admin.html
+++ b/loleaflet/dist/admin.html
@@ -11,16 +11,13 @@
<title>LibreOffice Online - Admin console</title>
<!-- Bootstrap core CSS -->
- <link href="../bootstrap/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/loleaflet/dist/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <link href="../bootstrap/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
+ <link href="/loleaflet/dist/bootstrap/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
<!-- Custom styles for this template -->
- <link href="../bootstrap/dashboard.css" rel="stylesheet">
-
- <link rel="stylesheet" href="../dialog/vex.css" />
- <link rel="stylesheet" href="../dialog/vex-theme-plain.css" />
+ <link href="/loleaflet/dist/bootstrap/dashboard.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
@@ -30,52 +27,58 @@
</head>
<body>
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
- <script>window.jQuery || document.write('<script src="bootstrap/assets/js/vendor/jquery.min.js"><\/script>')</script>
- <script src="../dialog/vex.combined.min.js"></script>
- <script src="admin-src.js"></script>
- <script>vex.defaultOptions.className = 'vex-theme-plain';</script>
+ <script src="/loleaflet/dist/admin-src.js"></script>
<script>
- host = 'wss://' + window.location.hostname + ':9989';
+ function getParameterByName(name) {
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+ var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
+ results = regex.exec(location.search);
+ return results === null ? "" : results[1].replace(/\+/g, " ");
+ }
+
+ var host = getParameterByName('host');
new AdminSocketOverview(host);
</script>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="#">LibreOffice Online - Admin console</a>
- </div>
- <div id="navbar" class="navbar-collapse collapse">
- <ul class="nav navbar-nav navbar-right">
- <li><a href="admin.html">Dashboard</a></li>
- <li><a href="adminSettings.html">Settings</a></li>
- <li><a href="#">Help</a></li>
- </ul>
- <form class="navbar-form navbar-right">
- <input type="text" class="form-control" placeholder="Search...">
- </form>
- </div>
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="#">LibreOffice Online - Admin console</a>
+ </div>
+ <div id="navbar" class="navbar-collapse collapse">
+ <ul class="nav navbar-nav navbar-right">
+ <li><a href="#">Dashboard</a></li>
+ <li><a href="#">Settings</a></li>
+ <li><a href="#">Profile</a></li>
+ <li><a href="#">Help</a></li>
+ </ul>
+ <form class="navbar-form navbar-right">
+ <input type="text" class="form-control" placeholder="Search...">
+ </form>
+ </div>
</div>
</nav>
<div class="container-fluid">
<div class="row">
- <div class="col-sm-3 col-md-2 sidebar">
- <ul class="nav nav-sidebar">
- <li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li>
- <li><a href="adminAnalytics.html">Analytics</a></li>
- </ul>
- </div>
- <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
- <h1 class="page-header">Dashboard</h1>
+ <div class="col-sm-3 col-md-2 sidebar">
+ <ul class="nav nav-sidebar">
+ <li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li>
+ <li><a href="#">Reports</a></li>
+ <li><a href="#">Analytics</a></li>
+ <li><a href="#">Export</a></li>
+ </ul>
+ </div>
+ <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
+ <h1 class="page-header">Dashboard</h1>
<div class="row placeholders">
<div class="col-xs-6 col-sm-3 placeholder">
@@ -111,19 +114,15 @@
</div>
</div>
- <div id="rowContextMenu" class="dropdown clearfix">
- <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu" style="display:block;position:static;margin-bottom:5px;">
- <li><a tabindex="-1" href="#">Kill</a></li>
- </ul>
- </div>
-
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
- <script src="../bootstrap/js/bootstrap.min.js"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+ <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
+ <script src="../../dist/bootstrap/js/bootstrap.min.js"></script>
<!-- Just to make our placeholder images work. Don't actually copy the next line! -->
- <script src="../bootstrap/assets/js/vendor/holder.min.js"></script>
+ <script src="../../dist/bootstrap/assets/js/vendor/holder.min.js"></script>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="../bootstrap/assets/js/ie10-viewport-bug-workaround.js"></script>
+ <script src="../../dist/bootstrap/assets/js/ie10-viewport-bug-workaround.js"></script>
</body>
</html>
diff --git a/loleaflet/dist/admin/admin-src.js b/loleaflet/dist/admin/admin-src.js
deleted file mode 100644
index 26de51f..0000000
--- a/loleaflet/dist/admin/admin-src.js
+++ /dev/null
@@ -1,710 +0,0 @@
-/*
- Base.js, version 1.1a
- Copyright 2006-2010, Dean Edwards
- License: http://www.opensource.org/licenses/mit-license.php
-*/
-
-var Base = function() {
- // dummy
-};
-
-Base.extend = function(_instance, _static) { // subclass
- var extend = Base.prototype.extend;
-
- // build the prototype
- Base._prototyping = true;
- var proto = new this;
- extend.call(proto, _instance);
- proto.base = function() {
- // call this method from any other method to invoke that method's ancestor
- };
- delete Base._prototyping;
-
- // create the wrapper for the constructor function
- //var constructor = proto.constructor.valueOf(); //-dean
- var constructor = proto.constructor;
- var klass = proto.constructor = function() {
- if (!Base._prototyping) {
- if (this._constructing || this.constructor == klass) { // instantiation
- this._constructing = true;
- constructor.apply(this, arguments);
- delete this._constructing;
- } else if (arguments[0] != null) { // casting
- return (arguments[0].extend || extend).call(arguments[0], proto);
- }
- }
- };
-
- // build the class interface
- klass.ancestor = this;
- klass.extend = this.extend;
- klass.forEach = this.forEach;
- klass.implement = this.implement;
- klass.prototype = proto;
- klass.toString = this.toString;
- klass.valueOf = function(type) {
- //return (type == "object") ? klass : constructor; //-dean
- return (type == "object") ? klass : constructor.valueOf();
- };
- extend.call(klass, _static);
- // class initialisation
- if (typeof klass.init == "function") klass.init();
- return klass;
-};
-
-Base.prototype = {
- extend: function(source, value) {
- if (arguments.length > 1) { // extending with a name/value pair
- var ancestor = this[source];
- if (ancestor && (typeof value == "function") && // overriding a method?
- // the valueOf() comparison is to avoid circular references
- (!ancestor.valueOf || ancestor.valueOf() != value.valueOf()) &&
- /\bbase\b/.test(value)) {
- // get the underlying method
- var method = value.valueOf();
- // override
- value = function() {
- var previous = this.base || Base.prototype.base;
- this.base = ancestor;
- var returnValue = method.apply(this, arguments);
- this.base = previous;
- return returnValue;
- };
- // point to the underlying method
- value.valueOf = function(type) {
- return (type == "object") ? value : method;
- };
- value.toString = Base.toString;
- }
- this[source] = value;
- } else if (source) { // extending with an object literal
- var extend = Base.prototype.extend;
- // if this object has a customised extend method then use it
- if (!Base._prototyping && typeof this != "function") {
- extend = this.extend || extend;
- }
- var proto = {toSource: null};
- // do the "toString" and other methods manually
- var hidden = ["constructor", "toString", "valueOf"];
- // if we are prototyping then include the constructor
- var i = Base._prototyping ? 0 : 1;
- while (key = hidden[i++]) {
- if (source[key] != proto[key]) {
- extend.call(this, key, source[key]);
-
- }
- }
- // copy each of the source object's properties to this object
- for (var key in source) {
- if (!proto[key]) extend.call(this, key, source[key]);
- }
- }
- return this;
- }
-};
-
-// initialise
-Base = Base.extend({
- constructor: function() {
- this.extend(arguments[0]);
- }
-}, {
- ancestor: Object,
- version: "1.1",
-
- forEach: function(object, block, context) {
- for (var key in object) {
- if (this.prototype[key] === undefined) {
- block.call(context, object[key], key, object);
- }
- }
- },
-
- implement: function() {
- for (var i = 0; i < arguments.length; i++) {
- if (typeof arguments[i] == "function") {
- // if it's a function, call it
- arguments[i](this.prototype);
- } else {
- // add the interface using the extend method
- this.prototype.extend(arguments[i]);
- }
- }
- return this;
- },
-
- toString: function() {
- return String(this.valueOf());
- }
-});
-
-
-
-/*
- Utility class
-*/
-/* global Base */
-var Util = Base.extend({
- constructor: null
-
-}, { // class itnerface
-
- humanize: function humanFileSize(kbytes) {
- var unit = 1000;
- var units = ['kB', 'MB', 'GB', 'TB'];
- for (var i = 0; Math.abs(kbytes) >= unit && i < units.length; i++) {
- kbytes /= unit;
- }
-
- return kbytes.toFixed(1) + ' ' + units[i];
- }
-});
-
-
-/*
- Abstract class
-*/
-
-/* global vex Base */
-/* exported AdminSocketBase */
-var AdminSocketBase = Base.extend({
- socket: null,
-
- constructor: function(host) {
- // because i am abstract
- if (this.constructor === AdminSocketBase) {
- throw new Error('Cannot instantiate abstract class');
- }
-
- // We do not allow such child class to instantiate websocket that do not implement
- // onSocketMessage and onSocketOpen.
- if (typeof this.onSocketMessage === 'function' && typeof this.onSocketOpen === 'function') {
- this.socket = new WebSocket(host);
- this.socket.onopen = this.onSocketOpen.bind(this);
- this.socket.onclose = this.onSocketClose.bind(this);
- this.socket.onmessage = this.onSocketMessage.bind(this);
- this.socket.onerror = this.onSocketError.bind(this);
- this.socket.binaryType = 'arraybuffer';
- }
- },
-
- onSocketOpen: function() {
- /* Implemented by child */
- },
-
- onSocketMessage: function() {
- /* Implemented by child */
- },
-
- onSocketClose: function() {
- this.socket.onerror = function() {};
- this.socket.onclose = function() {};
- this.socket.onmessage = function() {};
- this.socket.close();
- },
-
- onSocketError: function() {
- vex.dialog.alert('Connection error');
- }
-});
-
-
-/*
- Socket to be intialized on opening the overview page in Admin console
-*/
-/* global vex $ Util AdminSocketBase */
-var AdminSocketOverview = AdminSocketBase.extend({
- constructor: function(host) {
- this.base(host);
- },
-
- _basicStatsIntervalId: 0,
-
- _getBasicStats: function() {
- this.socket.send('total_mem');
- this.socket.send('active_docs_count');
- this.socket.send('active_users_count');
- },
-
- onSocketOpen: function() {
- this.socket.send('documents');
- this.socket.send('subscribe document addview rmview rmdoc');
-
- this._getBasicStats();
- var socketOverview = this;
- this._basicStatsIntervalId =
- setInterval(function() {
- return socketOverview._getBasicStats();
- }, 5000);
-
- // Allow table rows to have a context menu for killing children
- $('body').on('contextmenu', 'table tr', function(ev) {
- $('#rowContextMenu').css({
- display: 'block',
- left: ev.pageX,
- top: ev.pageY
- })
- .data('rowToKill', ev.target.parentElement.id);
-
- return false;
- })
- .click(function() {
- $('#rowContextMenu').hide();
- });
-
- $('#rowContextMenu').on('click', 'a', function() {
- vex.dialog.confirm({
- message: 'Are you sure you want to kill this child ?',
- callback: function(value) {
- if (value) {
- var killPid = ($('#rowContextMenu').data('rowToKill')).substring('doc'.length);
- socketOverview.socket.send('kill ' + killPid);
- }
- $('#rowContextMenu').hide();
- }
- });
- });
- },
-
- onSocketMessage: function(e) {
- var textMsg;
- if (typeof e.data === 'string') {
- textMsg = e.data;
- }
- else {
- textMsg = '';
- }
-
- var tableContainer = document.getElementById('doclist');
- var rowContainer;
- var pidEle, urlEle, viewsEle, memEle, docEle;
- var nViews, nTotalViews;
- var docProps, sPid, sUrl, sViews, sMem;
- if (textMsg.startsWith('documents')) {
- var documents = textMsg.substring('documents'.length);
- documents = documents.trim().split('\n');
- for (var i = 0; i < documents.length; i++) {
- if (documents[i] === '') {
- continue;
- }
- docProps = documents[i].trim().split(' ');
- sPid = docProps[0];
- sUrl = docProps[1];
- sViews = docProps[2];
- sMem = docProps[3];
- if (sUrl === '0') {
- continue;
- }
- rowContainer = document.createElement('tr');
- rowContainer.id = 'doc' + sPid;
- tableContainer.appendChild(rowContainer);
-
- pidEle = document.createElement('td');
- pidEle.innerHTML = sPid;
- rowContainer.appendChild(pidEle);
-
- urlEle = document.createElement('td');
- urlEle.innerHTML = sUrl;
- rowContainer.appendChild(urlEle);
-
- viewsEle = document.createElement('td');
- viewsEle.id = 'docview' + sPid;
- viewsEle.innerHTML = sViews;
- rowContainer.appendChild(viewsEle);
-
- memEle = document.createElement('td');
- memEle.innerHTML = Util.humanize(parseInt(sMem));
- rowContainer.appendChild(memEle);
- }
- }
- else if (textMsg.startsWith('addview')) {
- sPid = textMsg.substring('addview'.length).trim().split(' ')[0];
- nViews = parseInt(document.getElementById('docview' + sPid).innerHTML);
- document.getElementById('docview' + sPid).innerHTML = nViews + 1;
- nTotalViews = parseInt(document.getElementById('active_users_count').innerHTML);
- document.getElementById('active_users_count').innerHTML = nTotalViews + 1;
- }
- else if (textMsg.startsWith('rmview')) {
- sPid = textMsg.substring('addview'.length).trim().split(' ')[0];
- nViews = parseInt(document.getElementById('docview' + sPid).innerHTML);
- document.getElementById('docview' + sPid).innerHTML = nViews - 1;
- nTotalViews = parseInt(document.getElementById('active_users_count').innerHTML);
- document.getElementById('active_users_count').innerHTML = nTotalViews - 1;
- }
- else if (textMsg.startsWith('document')) {
- textMsg = textMsg.substring('document'.length);
- docProps = textMsg.trim().split(' ');
- sPid = docProps[0];
- sUrl = docProps[1];
- sMem = docProps[2];
-
- docEle = document.getElementById('doc' + sPid);
- if (docEle) {
- tableContainer.removeChild(docEle);
- }
- if (sUrl === '0') {
- return;
- }
-
- rowContainer = document.createElement('tr');
- rowContainer.id = 'doc' + docProps[0];
- tableContainer.appendChild(rowContainer);
-
- pidEle = document.createElement('td');
- pidEle.innerHTML = docProps[0];
- rowContainer.appendChild(pidEle);
-
- urlEle = document.createElement('td');
- urlEle.innerHTML = docProps[1];
- rowContainer.appendChild(urlEle);
-
- viewsEle = document.createElement('td');
- viewsEle.innerHTML = 0;
- viewsEle.id = 'docview' + docProps[0];
- rowContainer.appendChild(viewsEle);
-
- memEle = document.createElement('td');
- memEle.innerHTML = Util.humanize(parseInt(sMem));
- rowContainer.appendChild(memEle);
-
- var totalUsersEle = document.getElementById('active_docs_count');
- totalUsersEle.innerHTML = parseInt(totalUsersEle.innerHTML) + 1;
- }
- else if (textMsg.startsWith('total_mem') ||
- textMsg.startsWith('active_docs_count') ||
- textMsg.startsWith('active_users_count'))
- {
- textMsg = textMsg.split(' ');
- var sCommand = textMsg[0];
- var nData = parseInt(textMsg[1]);
-
- if (sCommand === 'total_mem') {
- nData = Util.humanize(nData);
- }
- document.getElementById(sCommand).innerHTML = nData;
- }
- else if (textMsg.startsWith('rmdoc')) {
- textMsg = textMsg.substring('rmdoc'.length);
- docProps = textMsg.trim().split(' ');
- sPid = docProps[0];
- docEle = document.getElementById('doc' + sPid);
- if (docEle) {
- tableContainer.removeChild(docEle);
- }
- }
- },
-
- onSocketClose: function() {
- clearInterval(this._basicStatsIntervalId);
- }
-});
-
-
-/*
- Socket to be intialized on opening the analytics page in Admin console
- containing various graphs to show to the user on specified interval
-*/
-
-/* global d3 Util AdminSocketBase */
-var AdminSocketAnalytics = AdminSocketBase.extend({
- constructor: function(host) {
- this.base(host);
- },
-
- _memStatsData: [],
- _cpuStatsData: [],
-
- _memStatsSize: 0,
- _memStatsInterval: 0,
-
- _cpuStatsSize: 0,
- _cpuStatsInterval: 0,
-
- _initMemStatsData: function(memStatsSize, memStatsInterval, reset) {
- if (reset) {
- this._memStatsData = [];
- }
-
- var offset = this._memStatsData.length * memStatsInterval;
- for (var i = 0; i < memStatsSize; i++) {
- this._memStatsData.unshift({time: -(offset), value: 0});
- offset += memStatsInterval;
- }
- },
-
- _initCpuStatsData: function() {
- for (var i = 0; i < this._cpuStatsSize; i++) {
- this._cpuStatsData.push({time: -((this._cpuStatsSize - i - 1) * this._cpuStatsInterval), value: 0});
- }
- },
-
- onSocketOpen: function() {
- this.socket.send('subscribe mem_stats cpu_stats settings');
- this.socket.send('settings');
- this.socket.send('mem_stats');
- },
-
- _createMemData: function() {
- for (var i = this._memStatsRawData.length - 1, j = this._memStatsData.length - 1; i >= 0 && j >= 0; i--, j--) {
- this._memStatsData[j].value = parseInt(this._memStatsRawData[i]);
- }
- },
-
- _d3xAxis: null,
- _d3yAxis: null,
- _d3line: null,
- _xScale: null,
- _yScale: null,
-
- _graphWidth: 1000,
- _graphHeight: 500,
- _graphMargins: {
- top: 20,
- right: 20,
- bottom: 20,
- left: 100
- },
-
- _setUpAxis: function() {
- this._xScale = d3.scale.linear().range([this._graphMargins.left, this._graphWidth - this._graphMargins.right]).domain([d3.min(this._memStatsData, function(d) {
- return d.time;
- }), d3.max(this._memStatsData, function(d) {
- return d.time;
- })]);
-
-
- this._yScale = d3.scale.linear().range([this._graphHeight - this._graphMargins.bottom, this._graphMargins.top]).domain([d3.min(this._memStatsData, function(d) {
- return d.value;
- }), d3.max(this._memStatsData, function(d) {
- return d.value;
- })]);
-
- this._d3xAxis = d3.svg.axis()
- .scale(this._xScale)
- .tickFormat(function(d) {
- d = Math.abs(d / 1000);
- var units = ['s', 'min', 'hr'];
- for (var i = 0; i < units.length && Math.abs(d) >= 60; i++) {
- d = parseInt(d / 60);
- }
- return parseInt(d) + units[i] + ' ago';
- });
-
- this._d3yAxis = d3.svg.axis()
- .scale(this._yScale)
- .tickFormat(function (d) {
- return Util.humanize(d);
- })
- .orient('left');
-
- var xScale = this._xScale;
- var yScale = this._yScale;
-
- this._d3line = d3.svg.line()
- .x(function(d) {
- return xScale(d.time);
- })
- .y(function(d) {
- return yScale(d.value);
- });
- },
-
- _createMemGraph: function() {
- var vis = d3.select('#visualisation');
-
- this._setUpAxis();
-
- vis.append('svg:g')
- .attr('class', 'x-axis')
- .attr('transform', 'translate(0,' + (this._graphHeight - this._graphMargins.bottom) + ')')
- .call(this._d3xAxis);
-
- vis.append('svg:g')
- .attr('class', 'y-axis')
- .attr('transform', 'translate(' + this._graphMargins.left + ',0)')
- .call(this._d3yAxis);
-
- vis.append('svg:path')
- .attr('d', this._d3line(this._memStatsData))
- .attr('class', 'line')
- .attr('stroke', 'blue')
- .attr('stroke-width', 2)
- .attr('fill', 'none');
- },
-
- _addNewMemData: function(data) {
- // make a space for new data
- for (var i = this._memStatsData.length - 1; i > 0; i--) {
- this._memStatsData[i].time = this._memStatsData[i - 1].time;
- }
-
- // push new data at time '0'
- this._memStatsData.push({time: 0, value: parseInt(data)});
-
- // remove extra items
- if (this._memStatsData.length > this._memStatsSize) {
- this._memStatsData.shift();
- }
- },
-
- _updateMemGraph: function() {
- var svg = d3.select('#visualisation');
-
- this._setUpAxis();
-
- svg.select('.line')
- .attr('d', this._d3line(this._memStatsData));
-
- svg.select('.x-axis')
- .call(this._d3xAxis);
-
- svg.select('.y-axis')
- .call(this._d3yAxis);
- },
-
- onSocketMessage: function(e) {
- var textMsg;
- if (typeof e.data === 'string') {
- textMsg = e.data;
- }
- else {
- textMsg = '';
- }
-
-
- if (textMsg.startsWith('settings')) {
- textMsg = textMsg.substring('settings '.length);
- textMsg = textMsg.split(' ');
-
- //TODO: Add CPU statistics
- var memStatsSize, memStatsInterval, cpuStatsSize, cpuStatsInterval;
- var i, j, data;
- memStatsSize = this._memStatsSize;
- memStatsInterval = this._memStatsInterval;
- cpuStatsSize = this._cpuStatsSize;
- cpuStatsInterval = this._cpuStatsInterval;
- for (i = 0; i < textMsg.length; i++) {
- var setting = textMsg[i].split('=');
- if (setting[0] === 'mem_stats_size') {
- memStatsSize = parseInt(setting[1]);
- }
- else if (setting[0] === 'mem_stats_interval') {
- memStatsInterval = parseInt(setting[1]);
- }
- else if (setting[0] === 'cpu_stats_size') {
- cpuStatsSize = parseInt(setting[1]);
- }
- else if (setting[0] === 'cpu_stats_interval') {
- cpuStatsInterval = parseInt(setting[1]);
- }
- }
-
- // Fix the axes according to changed data
- if (memStatsInterval !== this._memStatsInterval) {
- // We can possibly reuse the data with a bit of work
- this._initMemStatsData(memStatsSize, memStatsInterval, true);
- }
- else if (memStatsSize > this._memStatsSize) {
- this._initMemStatsData(memStatsSize - this._memStatsSize, memStatsInterval, false);
- }
- else {
- // just strip the extra items
- for (i = 0; i < this._memStatsSize - memStatsSize; i++) {
- this._memStatsData.shift();
- }
- }
-
- this._memStatsSize = memStatsSize;
- this._memStatsInterval = memStatsInterval;
- this._cpuStatsSize = cpuStatsSize;
- this._cpuStatsInterval = cpuStatsInterval;
- }
- else if (textMsg.startsWith('mem_stats') ||
- textMsg.startsWith('cpu_stats')) {
- textMsg = textMsg.split(' ')[1];
- if (textMsg.endsWith(',')) {
- // This is the result of query, not notification
- data = textMsg.substring(0, textMsg.length - 1).split(',');
- for (i = this._memStatsData.length - 1, j = data.length - 1; i >= 0 && j >= 0; i--, j--) {
- this._memStatsData[i].value = parseInt(data[j]);
- }
-
- //this._createMemData(data);
- this._createMemGraph();
- }
- else {
- // this is a notification data; append to _memStatsData
- data = textMsg.trim();
- this._addNewMemData(data);
- this._updateMemGraph();
- }
- }
- },
-
- onSocketClose: function() {
- clearInterval(this._basicStatsIntervalId);
- }
-});
-
-
-/*
- Socket to be intialized on opening the settings page in Admin console
-*/
-/* global $ AdminSocketBase */
-var AdminSocketSettings = AdminSocketBase.extend({
- constructor: function(host) {
- this.base(host);
- this._init();
- },
-
- _init: function() {
- var socketSettings = this.socket;
- $(document).ready(function() {
- $('#admin_settings').on('submit', function(e) {
- e.preventDefault();
- var memStatsSize = $('#mem_stats_size').val();
- var memStatsInterval = $('#mem_stats_interval').val();
- var cpuStatsSize = $('#cpu_stats_size').val();
- var cpuStatsInterval = $('#cpu_stats_interval').val();
- var command = 'set';
- command += ' mem_stats_size=' + memStatsSize;
- command += ' mem_stats_interval=' + memStatsInterval;
- command += ' cpu_stats_size=' + cpuStatsSize;
- command += ' cpu_stats_interval=' + cpuStatsInterval;
- socketSettings.send(command);
- });
- });
- },
-
- onSocketOpen: function() {
- this.socket.send('subscribe settings');
- this.socket.send('settings');
- },
-
- onSocketMessage: function(e) {
- var textMsg;
- if (typeof e.data === 'string') {
- textMsg = e.data;
- }
- else {
- textMsg = '';
- }
-
- if (textMsg.startsWith('settings')) {
- textMsg = textMsg.substring('settings '.length);
- var settings = textMsg.split(' ');
- for (var i = 0; i < settings.length; i++) {
- var setting = settings[i].split('=');
- var settingKey = setting[0];
- var settingVal = setting[1];
- document.getElementById(settingKey).value = settingVal;
- }
- }
- },
-
- onSocketClose: function() {
- clearInterval(this._basicStatsIntervalId);
- }
-});
-
-
diff --git a/loleaflet/dist/admin/adminAnalytics.html b/loleaflet/dist/admin/adminAnalytics.html
deleted file mode 100644
index 5f4fb67..0000000
--- a/loleaflet/dist/admin/adminAnalytics.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
- <meta name="description" content="">
- <meta name="author" content="">
-
- <title>LibreOffice Online - Admin console</title>
-
- <!-- Bootstrap core CSS -->
- <link href="../bootstrap/css/bootstrap.min.css" rel="stylesheet">
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <link href="../bootstrap/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
-
- <!-- Custom styles for this template -->
- <link href="../bootstrap/dashboard.css" rel="stylesheet">
-
- <link rel="stylesheet" href="../dialog/vex.css" />
- <link rel="stylesheet" href="../dialog/vex-theme-plain.css" />
-
- <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- </head>
-
- <body>
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
- <script>window.jQuery || document.write('<script src="../bootstrap/assets/js/vendor/jquery.min.js"><\/script>')</script>
- <script src="../dialog/vex.combined.min.js"></script>
- <script>vex.defaultOptions.className = 'vex-theme-plain';</script>
- <script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script>
- <script src="admin-src.js"></script>
- <script>
-
- host = 'wss://' + window.location.hostname + ':9989';
- new AdminSocketAnalytics(host);
-
- </script>
-
- <nav class="navbar navbar-inverse navbar-fixed-top">
- <div class="container-fluid">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="#">LibreOffice Online - Admin console</a>
- </div>
- <div id="navbar" class="navbar-collapse collapse">
- <ul class="nav navbar-nav navbar-right">
- <li><a href="admin.html?host=ws://localhost:9989">Dashboard</a></li>
- <li><a href="adminSettings.html?host=ws://localhost:9989">Settings</a></li>
- <li><a href="#">Help</a></li>
- </ul>
- <form class="navbar-form navbar-right">
- <input type="text" class="form-control" placeholder="Search...">
- </form>
- </div>
- </div>
- </nav>
-
- <div class="container-fluid">
- <div class="row">
- <div class="col-sm-3 col-md-2 sidebar">
- <ul class="nav nav-sidebar">
- <li><a href="admin.html">Overview <span class="sr-only">(current)</span></a></li>
- <li class="active"><a href="adminAnalytics.html">Analytics</a></li>
- </ul>
- </div>
- <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
- <h1 class="page-header">Graphs</h1>
- <div class="graph-container">
- <div class="jumbotron">
- <svg id="visualisation" width="1000" height="500"></svg>
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
- <script>window.jQuery || document.write('<script src="../bootstrap/js/vendor/jquery.min.js"><\/script>')</script>
- <script src="../bootstrap/js/bootstrap.min.js"></script>
- <!-- Just to make our placeholder images work. Don't actually copy the next line! -->
- <script src="../bootstrap/assets/js/vendor/holder.min.js"></script>
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="../bootstrap/assets/js/ie10-viewport-bug-workaround.js"></script>
- </body>
-</html>
diff --git a/loleaflet/dist/admin/adminSettings.html b/loleaflet/dist/admin/adminSettings.html
deleted file mode 100644
index 1db8279..0000000
--- a/loleaflet/dist/admin/adminSettings.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
- <meta name="description" content="">
- <meta name="author" content="">
-
- <title>LibreOffice Online - Admin console</title>
-
- <!-- Bootstrap core CSS -->
- <link href="../bootstrap/css/bootstrap.min.css" rel="stylesheet">
-
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <link href="../bootstrap/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
-
- <!-- Custom styles for this template -->
- <link href="../bootstrap/dashboard.css" rel="stylesheet">
-
- <link rel="stylesheet" href="../dialog/vex.css" />
- <link rel="stylesheet" href="../dialog/vex-theme-plain.css" />
-
- <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
- <!--[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]-->
- </head>
-
- <body>
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
- <script>window.jQuery || document.write('<script src="../bootstrap/assets/js/vendor/jquery.min.js"><\/script>')</script>
- <script src="../dialog/vex.combined.min.js"></script>
- <script>vex.defaultOptions.className = 'vex-theme-plain';</script>
- <script src="admin-src.js"></script>
- <script>
-
- host = 'wss://' + window.location.hostname + ':9989';
- new AdminSocketSettings(host);
-
- </script>
-
- <nav class="navbar navbar-inverse navbar-fixed-top">
- <div class="container-fluid">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="#">LibreOffice Online - Admin console</a>
- </div>
- <div id="navbar" class="navbar-collapse collapse">
- <ul class="nav navbar-nav navbar-right">
- <li><a href="admin.html">Dashboard</a></li>
- <li><a href="adminSettings.html">Settings</a></li>
- <li><a href="#">Help</a></li>
- </ul>
- <form class="navbar-form navbar-right">
- <input type="text" class="form-control" placeholder="Search...">
- </form>
- </div>
- </div>
- </nav>
-
- <div class="container-fluid">
- <div class="row">
- <div class="col-sm-3 col-md-2 sidebar">
- <ul class="nav nav-sidebar">
- <li><a href="admin.html">Overview <span class="sr-only">(current)</span></a></li>
- <li><a href="adminAnalytics.html">Analytics</a></li>
- </ul>
- </div>
- <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
- <h1 class="page-header">Settings</h1>
- <form id="admin_settings">
- <label for="mem_stats_size">Memory Stats Cache size</label>
- <input type="text" id="mem_stats_size" name="Memory Stats Size"><br/>
- <label for="mem_stats_interval">Memory Stats Interval (in ms)</label>
- <input type="text" id="mem_stats_interval" name="Memory Stats Interval"><br/>
-
- <label for="cpu_stats_size">Cpu Stats Cache size</label>
- <input type="text" id="cpu_stats_size" name="Cpu Stats Size"><br/>
- <label for="cpu_stats_interval">Cpu Stats Interval (in ms)</label>
- <input type="text" id="cpu_stats_interval" name="Cpu Stats Interval"><br/>
- <input type="submit" value="Save"/><br/>
- </form>
- </div>
- </div>
- </div>
- </div>
-
- <!-- Bootstrap core JavaScript
- ================================================== -->
- <!-- Placed at the end of the document so the pages load faster -->
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
- <script>window.jQuery || document.write('<script src="../bootstrap/assets/js/vendor/jquery.min.js"><\/script>')</script>
- <script src="../bootstrap/js/bootstrap.min.js"></script>
- <!-- Just to make our placeholder images work. Don't actually copy the next line! -->
- <script src="../bootstrap/assets/js/vendor/holder.min.js"></script>
- <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
- <script src="../bootstrap/assets/js/ie10-viewport-bug-workaround.js"></script>
- </body>
-</html>
commit 09d3c5f230602be75150570a1ee3eaae9dad6d2b
Author: Tor Lillqvist <tml at collabora.com>
Date: Mon Mar 21 16:52:46 2016 +0200
Revert "loolwsd: Allow specifying custom file server root"
This reverts commit a5f8ba44a2b9bb26ec9196a306f9f1b4d60afc79.
diff --git a/loolwsd/FileServer.hpp b/loolwsd/FileServer.hpp
index 102ace1..9c62e41 100644
--- a/loolwsd/FileServer.hpp
+++ b/loolwsd/FileServer.hpp
@@ -32,7 +32,6 @@
#include <Poco/Util/Timer.h>
#include "Common.hpp"
-#include "LOOLWSD.hpp"
using Poco::Net::HTTPRequest;
using Poco::Net::HTTPRequestHandler;
@@ -56,8 +55,8 @@ public:
std::vector<std::string> requestSegments;
requestUri.getPathSegments(requestSegments);
- // TODO: We might want to package all files from leaflet to some other dir and restrict
- // file serving to it (?)
+ // FIXME: We might want to package all dist files from leaflet to some other dir (?)
+ const std::string loleafletPath = Poco::Path(Application::instance().commandPath()).parent().parent().toString() + "loleaflet";
const std::string endPoint = requestSegments[requestSegments.size() - 1];
if (request.getMethod() == HTTPRequest::HTTP_GET)
@@ -80,7 +79,7 @@ public:
Poco::Net::HTTPCookie cookie("jwt", jwtToken);
response.addCookie(cookie);
response.setContentType(htmlMimeType);
- response.sendFile(LOOLWSD::FileServerRoot + requestUri.getPath(), htmlMimeType);
+ response.sendFile(loleafletPath + "/debug/document/" + endPoint, htmlMimeType);
}
else
{
@@ -88,12 +87,12 @@ public:
throw Poco::Net::NotAuthenticatedException("Wrong credentials.");
}
}
- else
+ else if (requestSegments.size() > 1 && requestSegments[0] == "dist")
{
const std::string filePath = requestUri.getPath();
const std::size_t extPoint = endPoint.find_last_of(".");
if (extPoint == std::string::npos)
- throw Poco::FileNotFoundException("Invalid file.");
+ return;
const std::string fileType = endPoint.substr(extPoint + 1);
std::string mimeType;
@@ -101,13 +100,15 @@ public:
mimeType = "application/javascript";
else if (fileType == "css")
mimeType = "text/css";
- else if (fileType == "html")
- mimeType = "text/html";
else
mimeType = "text/plain";
response.setContentType(mimeType);
- response.sendFile(LOOLWSD::FileServerRoot + requestUri.getPath(), mimeType);
+ response.sendFile(loleafletPath + request.getURI(), mimeType);
+ }
+ else
+ {
+ throw Poco::FileNotFoundException("");
}
}
}
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index eb499cc..ba30f41 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -935,7 +935,6 @@ std::string LOOLWSD::SysTemplate;
std::string LOOLWSD::LoTemplate;
std::string LOOLWSD::ChildRoot;
std::string LOOLWSD::LoSubPath = "lo";
-std::string LOOLWSD::FileServerRoot;
int LOOLWSD::NumPreSpawnedChildren = 10;
bool LOOLWSD::DoTest = false;
@@ -1010,11 +1009,6 @@ void LOOLWSD::defineOptions(OptionSet& optionSet)
.repeatable(false)
.argument("relative path"));
- optionSet.addOption(Option("fileserverroot", "", "Path to the directory that should be considered root for the file server (default: '../loleaflet/').")
- .required(false)
- .repeatable(false)
- .argument("directory"));
-
optionSet.addOption(Option("numprespawns", "", "Number of child processes to keep started in advance and waiting for new clients.")
.required(false)
.repeatable(false)
@@ -1051,8 +1045,6 @@ void LOOLWSD::handleOption(const std::string& optionName, const std::string& val
ChildRoot = value;
else if (optionName == "losubpath")
LoSubPath = value;
- else if (optionName == "fileserverroot")
- FileServerRoot = value;
else if (optionName == "numprespawns")
NumPreSpawnedChildren = std::stoi(value);
else if (optionName == "test")
@@ -1148,9 +1140,6 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
else if (ChildRoot[ChildRoot.size() - 1] != Path::separator())
ChildRoot += Path::separator();
- if (FileServerRoot.empty())
- FileServerRoot = Path(Application::instance().commandPath()).parent().parent().toString();
-
if (ClientPortNumber == MASTER_PORT_NUMBER)
throw IncompatibleOptionsException("port");
diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp
index 5504888..3fc2531 100644
--- a/loolwsd/LOOLWSD.hpp
+++ b/loolwsd/LOOLWSD.hpp
@@ -44,7 +44,6 @@ public:
static std::string LoTemplate;
static std::string ChildRoot;
static std::string LoSubPath;
- static std::string FileServerRoot;
//static Auth AuthAgent;
static const std::string PIDLOG;
More information about the Libreoffice-commits
mailing list