loleaflet/dist/errormessages.js | 2 +- loleaflet/src/core/Socket.js | 40 ++++++++++++++++++++++------------------ wsd/LOOLWSD.cpp | 33 ++++++++++++++++++++++++++++++--- wsd/UserMessages.hpp | 3 ++- 4 files changed, 55 insertions(+), 23 deletions(-)
New commits: commit 96292dc873ea2b021b22c755f02293184d818714 Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Date: Tue Feb 13 16:36:38 2018 +0100 Only apply hard limit when configured with support key In other case, show the warning to all users (instead of just the last one) and link to our get professional help page. Change-Id: Id443ba6427acd4c05f7e0e2ce86025acfb553265 Reviewed-on: https://gerrit.libreoffice.org/49673 Reviewed-by: Michael Meeks <michael.me...@collabora.com> Tested-by: Michael Meeks <michael.me...@collabora.com> diff --git a/loleaflet/dist/errormessages.js b/loleaflet/dist/errormessages.js index fa6a9997..edda0764 100644 --- a/loleaflet/dist/errormessages.js +++ b/loleaflet/dist/errormessages.js @@ -1,6 +1,6 @@ exports.diskfull = _('No disk space left on server, please contact the server administrator to continue.'); exports.emptyhosturl = _('The host URL is empty. The loolwsd server is probably misconfigured, please contact the administrator.'); -exports.limitreached = _('This development build is limited to %0 documents, and %1 connections - to avoid the impression that it is suitable for deployment in large enterprises. To find out more about deploying and scaling %2 check out: <br/><a href=\"%3\">%3</a>.'); +exports.limitreached = _('This is an unsupported version of {productname}. To avoid the impression that it is suitable for deployment in enterprises, this version is limited to {docs} documents, and {connections} connections.<br/>{a}More information and support{/a}'); exports.limitreachedprod = _('This service is limited to %0 documents, and %1 connections total by the admin. This limit has been reached. Please try again later.'); exports.serviceunavailable = _('Service is unavailable. Please try again later and report to your administrator if the issue persists.'); exports.unauthorized = _('Unauthorized WOPI host. Please try again later and report to your administrator if the issue persists.'); diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js index 9cb99c23..3e33a88d 100644 --- a/loleaflet/src/core/Socket.js +++ b/loleaflet/src/core/Socket.js @@ -7,6 +7,7 @@ L.Socket = L.Class.extend({ ProtocolVersionNumber: '0.1', ReconnectCount: 0, + WasShownLimitDialog: false, getParameterValue: function (s) { var i = s.indexOf('='); @@ -550,31 +551,34 @@ L.Socket = L.Class.extend({ } else if (textMsg.startsWith('error:') && !this._map._docLayer) { textMsg = textMsg.substring(6); - if (command.errorKind === 'limitreached') { - this._map._fatal = true; - this._map._active = false; // Practically disconnected. + if (command.errorKind === 'hardlimitreached') { - // Servers configured for 50 documents are not demo/development. - if (parseInt(command.params[0]) >= 50) { - textMsg = errorMessages.limitreachedprod; - textMsg = textMsg.replace(/%0/g, command.params[0]); - textMsg = textMsg.replace(/%1/g, command.params[1]); - } - else { - textMsg = errorMessages.limitreached; - textMsg = textMsg.replace(/%0/g, command.params[0]); - textMsg = textMsg.replace(/%1/g, command.params[1]); - textMsg = textMsg.replace(/%2/g, (typeof brandProductName !== 'undefined' ? brandProductName : 'LibreOffice Online')); - textMsg = textMsg.replace(/%3/g, (typeof brandProductFAQURL !== 'undefined' ? brandProductFAQURL : 'https://wiki.documentfoundation.org/Development/LibreOffice_Online')); - } + textMsg = errorMessages.limitreachedprod; + textMsg = textMsg.replace(/%0/g, command.params[0]); + textMsg = textMsg.replace(/%1/g, command.params[1]); } else if (command.errorKind === 'serviceunavailable') { - this._map._fatal = true; - this._map._active = false; // Practically disconnected. textMsg = errorMessages.serviceunavailable; } + this._map._fatal = true; + this._map._active = false; // Practically disconnected. this._map.fire('error', {msg: textMsg}); } + else if (textMsg.startsWith('info:') && command.errorCmd === 'socket') { + if (command.errorKind === 'limitreached' && !this.WasShownLimitDialog) { + this.WasShownLimitDialog = true; + textMsg = errorMessages.limitreached; + textMsg = textMsg.replace(/{docs}/g, command.params[0]); + textMsg = textMsg.replace(/{connections}/g, command.params[1]); + textMsg = textMsg.replace(/{productname}/g, (typeof brandProductName !== 'undefined' ? + brandProductName : 'LibreOffice Online')); + brandProductFAQURL = (typeof brandProductFAQURL !== 'undefined') ? + brandProductFAQURL : 'https://hub.libreoffice.org/professional-online-support'; + textMsg = textMsg.replace(/{a}/g, '<a target="_blank" href="'+brandProductFAQURL+'">'); + textMsg = textMsg.replace(/{\/a}/g, '</a>'); + this._map.fire('error', {msg: textMsg}); + } + } else if (textMsg.startsWith('pong ') && this._map._docLayer && this._map._docLayer._debug) { var times = this._map._docLayer._debugTimePING; var timeText = this._map._docLayer._debugSetTimes(times, +new Date() - this._map._docLayer._debugPINGQueue.shift()); diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index e27266e4..24b5a4aa 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -196,7 +196,7 @@ namespace inline void shutdownLimitReached(WebSocketHandler& ws) { const std::string error = Poco::format(PAYLOAD_UNAVAILABLE_LIMIT_REACHED, LOOLWSD::MaxDocuments, LOOLWSD::MaxConnections); - LOG_INF("Sending client limit-reached message: " << error); + LOG_INF("Sending client 'hardlimitreached' message: " << error); try { @@ -212,6 +212,22 @@ inline void shutdownLimitReached(WebSocketHandler& ws) } } +inline void infoLimitReached() +{ + const std::string info = Poco::format(PAYLOAD_INFO_LIMIT_REACHED, LOOLWSD::MaxDocuments, LOOLWSD::MaxConnections); + LOG_INF("Sending client 'limitreached' message: " << info); + + try + { + Util::alertAllUsers(info); + } + catch (const std::exception& ex) + { + LOG_ERR("Error while shuting down socket on reaching limit: " << ex.what()); + } +} + + /// Internal implementation to alert all clients /// connected to any document. void alertAllUsersInternal(const std::string& msg) @@ -1454,9 +1470,11 @@ static std::shared_ptr<DocumentBroker> findOrCreateDocBroker(WebSocketHandler& w if (DocBrokers.size() + 1 > LOOLWSD::MaxDocuments) { - LOG_ERR("Maximum number of open documents of " << LOOLWSD::MaxDocuments << " reached."); + LOG_INF("Maximum number of open documents of " << LOOLWSD::MaxDocuments << " reached."); +#if ENABLE_SUPPORT_KEY shutdownLimitReached(ws); return nullptr; +#endif } // Set the one we just created. @@ -1486,6 +1504,13 @@ static std::shared_ptr<ClientSession> createNewClientSession(const WebSocketHand // Alert all other existing sessions also Util::alertAllUsers(diskfullMsg); } +#if !ENABLE_SUPPORT_KEY + // Users of development versions get just an info when reaching max documents or connections + if (DocBrokers.size() + 1 > LOOLWSD::MaxDocuments || LOOLWSD::NumConnections >= LOOLWSD::MaxConnections) + { + infoLimitReached(); + } +#endif // Now we have a DocumentBroker and we're ready to process client commands. if (ws) @@ -2257,9 +2282,11 @@ private: { if (LOOLWSD::NumConnections >= LOOLWSD::MaxConnections) { - LOG_ERR("Limit on maximum number of connections of " << LOOLWSD::MaxConnections << " reached."); + LOG_INF("Limit on maximum number of connections of " << LOOLWSD::MaxConnections << " reached."); +#if ENABLE_SUPPORT_KEY shutdownLimitReached(ws); return; +#endif } LOG_INF("Starting GET request handler for session [" << _id << "] on url [" << url << "]."); diff --git a/wsd/UserMessages.hpp b/wsd/UserMessages.hpp index 3efbdf8d..00ad7875 100644 --- a/wsd/UserMessages.hpp +++ b/wsd/UserMessages.hpp @@ -13,7 +13,8 @@ #define INCLUDED_USERMESSAGES_HPP constexpr const char* SERVICE_UNAVAILABLE_INTERNAL_ERROR = "error: cmd=socket kind=serviceunavailable"; -constexpr const char* PAYLOAD_UNAVAILABLE_LIMIT_REACHED = "error: cmd=socket kind=limitreached params=%u,%u"; +constexpr const char* PAYLOAD_UNAVAILABLE_LIMIT_REACHED = "error: cmd=socket kind=hardlimitreached params=%u,%u"; +constexpr const char* PAYLOAD_INFO_LIMIT_REACHED = "info: cmd=socket kind=limitreached params=%u,%u"; #endif _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits