loleaflet/js/global.js                           |   50 ++++++++++++++++++++---
 loleaflet/src/control/Control.JSDialogBuilder.js |    2 
 wsd/LOOLWSD.cpp                                  |   15 ++++++
 3 files changed, 60 insertions(+), 7 deletions(-)

New commits:
commit d5f77d46554908d44e3328ca49272e5664e3dc55
Author:     Michael Meeks <michael.me...@collabora.com>
AuthorDate: Mon Jun 8 15:46:29 2020 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Jun 8 22:22:16 2020 +0200

    Proxy: handle server startup / un-responsive DocumentBroker creation.
    
    If our 'open' request fails - then we could get this loop:
    
    loadDocument (proxy.php?req=/loleaflet/d2d049224/src/map/Map.js:318)
    _activate (proxy.php?req=/loleaflet/d2d049224/src/map/Map.js:1233)
    _onSocketClose (proxy.php?req=/loleaflet/d2d049224/src/core/Socket.js:1045)
    _signalErrorClose 
(proxy.php?req=/loleaflet/0acb00fc2/loleaflet.html?file_path=file:///tmp/copy.odt:576)
    (anonymous) 
(proxy.php?req=/loleaflet/0acb00fc2/loleaflet.html?file_path=file:///tmp/copy.odt:688)
    load (async)
    getSessionId 
(proxy.php?req=/loleaflet/0acb00fc2/loleaflet.html?file_path=file:///tmp/copy.odt:682)
    global.ProxySocket 
(proxy.php?req=/loleaflet/0acb00fc2/loleaflet.html?file_path=file:///tmp/copy.odt:753)
    global.createWebSocket 
(proxy.php?req=/loleaflet/0acb00fc2/loleaflet.html?file_path=file:///tmp/copy.odt:798)
    connect (proxy.php?req=/loleaflet/d2d049224/src/core/Socket.js:52)
    loadDocument (proxy.php?req=/loleaflet/d2d049224/src/map/Map.js:318)
    
    Which would hammer the server with large numbers of requests triggering
    DoS protection in some cases, so:
    1. only allow one 'open' in-flight at a time
    2. global time-accounting to not allow >1 new ProxySocket every 250ms
    3. handle error returns from 'open' correctly.
    
    Change-Id: I1692acd72a445ebc70a83c66a2e802a532c66e21
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95837
    Tested-by: Jenkins
    Tested-by: Michael Meeks <michael.me...@collabora.com>
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/loleaflet/js/global.js b/loleaflet/js/global.js
index 9036da5e5..0cafa649c 100644
--- a/loleaflet/js/global.js
+++ b/loleaflet/js/global.js
@@ -221,6 +221,7 @@
                this.id = window.proxySocketCounter++;
                this.sendCounter = 0;
                this.msgInflight = 0;
+               this.openInflight = 0;
                this.inSerial = 0;
                this.outSerial = 0;
                this.minPollMs = 25; // Anything less than ~25 ms can overwhelm 
the HTTP server.
@@ -354,8 +355,13 @@
                                this.onerror();
                                this.onclose();
                                clearInterval(this.waitInterval);
+                               clearTimeout(this.delaySession);
                                this.waitInterval = undefined;
                                this.sessionId = 'open';
+                               this.inSerial = 0;
+                               this.outSerial = 0;
+                               this.msgInflight = 0;
+                               this.openInflight = 0;
                        }
                        this.readyState = 3; // CLOSED
                };
@@ -371,9 +377,6 @@
                                        console.debug('Session closed, opening 
a new one.');
                                        that.getSessionId();
                                }
-                               else
-                                       console.debug('New session not 
completed.');
-
                                return;
                        }
 
@@ -448,14 +451,41 @@
                        that.msgInflight++;
                };
                this.getSessionId = function() {
+                       if (this.openInflight > 0)
+                       {
+                               console.debug('Waiting for session open');
+                               return;
+                       }
+
+                       if (this.delaySession)
+                               return;
+
+                       // avoid attempting to re-connect too quickly
+                       if (global.lastCreatedProxySocket)
+                       {
+                               var msSince = performance.now() - 
global.lastCreatedProxySocket;
+                               if (msSince < 250) {
+                                       var delay = 250 - msSince;
+                                       console.debug('Wait to re-try session 
creation for ' + delay + 'ms');
+                                       this.curPollMs = delay; // ms
+                                       this.delaySession = 
setTimeout(function() {
+                                               that.delaySession = undefined;
+                                               that.getSessionId();
+                                       }, delay);
+                                       return;
+                               }
+                       }
+                       global.lastCreatedProxySocket = performance.now();
+
                        var req = new XMLHttpRequest();
                        req.open('POST', that.getEndPoint('open'));
                        req.responseType = 'text';
                        req.addEventListener('load', function() {
                                console.debug('got session: ' + 
this.responseText);
-                               if (this.responseText.indexOf('\n') >= 0)
+                               if (this.status !== 200 || !this.responseText ||
+                                   this.responseText.indexOf('\n') >= 0) // 
multi-line error
                                {
-                                       console.debug('Error: failed to fetch 
session id!');
+                                       console.debug('Error: failed to fetch 
session id! error: ' + this.status);
                                        that._signalErrorClose();
                                }
                                else
@@ -465,7 +495,12 @@
                                        that.onopen();
                                }
                        });
+                       req.addEventListener('loadend', function() {
+                               console.debug('Open completed state: ' + 
that.readyState);
+                               that.openInflight--;
+                       });
                        req.send('');
+                       this.openInflight++;
                };
                this.send = function(msg) {
                        var hadData = this.sendQueue.length > 0;
@@ -503,6 +538,7 @@
                        this.readyState = 3;
                        this.onclose();
                        clearInterval(this.waitInterval);
+                       clearTimeout(this.delaySession);
                        this.waitInterval = undefined;
                        if (oldState === 1) // was open
                                this.sendCloseMsg(this.unloading);
commit a4bcbd74ab90eb3b1e6da421dad9215393c36483
Author:     Michael Meeks <michael.me...@collabora.com>
AuthorDate: Mon Jun 8 16:27:50 2020 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Jun 8 22:22:09 2020 +0200

    Proxy: remove double images/ in path.
    
    Change-Id: I0db7953501acf397e361a0483a999735bfce7557
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95842
    Tested-by: Michael Meeks <michael.me...@collabora.com>
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/loleaflet/src/control/Control.JSDialogBuilder.js 
b/loleaflet/src/control/Control.JSDialogBuilder.js
index debd6739a..8c8426c9e 100644
--- a/loleaflet/src/control/Control.JSDialogBuilder.js
+++ b/loleaflet/src/control/Control.JSDialogBuilder.js
@@ -567,7 +567,7 @@ L.Control.JSDialogBuilder = L.Control.extend({
                if (commandName && commandName.length && 
L.LOUtil.existsIconForCommand(commandName, builder.map.getDocType())) {
                        var iconName = 
builder._generateMenuIconName(commandName);
                        var iconSpan = L.DomUtil.create('span', 
'menu-entry-icon ' + iconName, sectionTitle);
-                       var iconURL = L.LOUtil.getImageURL('images/lc_' + 
iconName + '.svg');
+                       var iconURL = L.LOUtil.getImageURL('lc_' + iconName + 
'.svg');
                        icon = L.DomUtil.create('img', '', iconSpan);
                        icon.src = iconURL;
                        icon.alt = '';
commit 77e075b1dfd2f5fecb55ad9e272e2d74bff74ee4
Author:     Michael Meeks <michael.me...@collabora.com>
AuthorDate: Mon Jun 8 14:48:57 2020 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Jun 8 22:22:04 2020 +0200

    Proxy: only send close if we were connected.
    
    Change-Id: I4b80adb1d4f44efc02b784cad10f27e458921449
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95836
    Tested-by: Jenkins
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/loleaflet/js/global.js b/loleaflet/js/global.js
index 1c951b089..9036da5e5 100644
--- a/loleaflet/js/global.js
+++ b/loleaflet/js/global.js
@@ -498,12 +498,14 @@
                                navigator.sendBeacon(url, '');
                };
                this.close = function() {
+                       var oldState = this.readyState;
                        console.debug('proxy: close socket');
                        this.readyState = 3;
                        this.onclose();
                        clearInterval(this.waitInterval);
                        this.waitInterval = undefined;
-                       this.sendCloseMsg(this.unloading);
+                       if (oldState === 1) // was open
+                               this.sendCloseMsg(this.unloading);
                        this.sessionId = 'open';
                };
                this.setUnloading = function() {
commit 9f12876417c04442f309452afea789ea0d242a3a
Author:     Michael Meeks <michael.me...@collabora.com>
AuthorDate: Mon Jun 8 14:43:04 2020 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Mon Jun 8 22:21:58 2020 +0200

    Proxy: shutdown socket with error if we can't find documentbroker.
    
    Also called if/as/when the document is unloading as you connect.
    
    Change-Id: I494dc207219298e07fba664cd2cbdd5d5b8ac889
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/95809
    Tested-by: Jenkins
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index 39365cbe7..12898f506 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -3016,6 +3016,21 @@ private:
                         });
                 });
         }
+        else
+        {
+            auto streamSocket = 
std::static_pointer_cast<StreamSocket>(disposition.getSocket());
+            LOG_ERR("Failed to find document");
+            // badness occurred:
+            std::ostringstream oss;
+            oss << "HTTP/1.1 400\r\n"
+                << "Date: " << Util::getHttpTimeNow() << "\r\n"
+                << "User-Agent: LOOLWSD WOPI Agent\r\n"
+                << "Content-Length: \r\n"
+                << "\r\n";
+            // FIXME: send docunloading & re-try on client ?
+            streamSocket->send(oss.str());
+            streamSocket->shutdown();
+        }
     }
 
     void handleClientWsUpgrade(const Poco::Net::HTTPRequest& request,
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to