From 914c442615548fc0df21468c48e94b3536322042 Mon Sep 17 00:00:00 2001
From: yflory <yann.flory@xwiki.com>
Date: Wed, 8 Feb 2017 12:54:07 +0100
Subject: [PATCH] Do not redirect to home page when logging out from another
 tab

---
 customize.dist/fsStore.js                  | 13 ++++++++++-
 customize.dist/translations/messages.fr.js |  1 +
 customize.dist/translations/messages.js    |  1 +
 www/code/main.js                           |  2 ++
 www/common/cryptpad-common.js              | 19 ++++++++++++++--
 www/common/toolbar.js                      | 26 +++++++++++++++-------
 www/drive/main.js                          |  2 ++
 www/pad/main.js                            |  2 ++
 www/poll/main.js                           |  2 ++
 www/slide/main.js                          |  2 ++
 10 files changed, 59 insertions(+), 11 deletions(-)

diff --git a/customize.dist/fsStore.js b/customize.dist/fsStore.js
index 83fcb8066..bbf3d34e6 100644
--- a/customize.dist/fsStore.js
+++ b/customize.dist/fsStore.js
@@ -176,7 +176,18 @@ define([
                 window.location.reload();
             } else if (o && !n) {
                 //window.location.reload();
-                window.location.href = '/';
+                //window.location.href = '/';
+                $(window).on('keyup', function (e) {
+                    if (e.keyCode === 27) {
+                        Cryptpad.removeLoadingScreen();
+                    }
+                });
+                Cryptpad.logout();
+                Cryptpad.addLoadingScreen();
+                Cryptpad.errorLoadingScreen(Messages.onLogout, true);
+                if (exp.info) {
+                    exp.info.network.disconnect();
+                }
             }
         });
 
diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js
index 9e738720b..1bc60132e 100644
--- a/customize.dist/translations/messages.fr.js
+++ b/customize.dist/translations/messages.fr.js
@@ -25,6 +25,7 @@ define(function () {
 
     out.websocketError = 'Impossible de se connecter au serveur WebSocket...';
     out.typeError = "Ce document temps-réel n'est pas compatible avec l'application sélectionnée";
+    out.onLogout = 'Vous êtes déconnecté de votre compte utilisateur, <a href="/" target="_blank">cliquez ici</a> pour vous authentifier<br>ou appuyez sur <em>Échap</em> pour accéder au document en mode lecture seule.';
 
     out.loading = "Chargement...";
     out.error = "Erreur";
diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js
index 4f53c1a00..4c11ebf1d 100644
--- a/customize.dist/translations/messages.js
+++ b/customize.dist/translations/messages.js
@@ -29,6 +29,7 @@ define(function () {
 
     out.websocketError = 'Unable to connect to the websocket server...';
     out.typeError = "That realtime document is not compatible with the selected application";
+    out.onLogout = 'You are logged out, <a href="/" target="_blank">click here</a> to log in<br>or press <em>Escape</em> to access your pad in read-only mode.';
 
     out.loading = "Loading...";
     out.error = "Error";
diff --git a/www/code/main.js b/www/code/main.js
index 2e9d2f97b..ba1208a2d 100644
--- a/www/code/main.js
+++ b/www/code/main.js
@@ -719,6 +719,8 @@ define([
             var realtime = module.realtime = Realtime.start(config);
 
             editor.on('change', onLocal);
+
+            Cryptpad.onLogout(function () { setEditable(false); });
         };
 
         var interval = 100;
diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js
index 845eafe3e..ff2943c16 100644
--- a/www/common/cryptpad-common.js
+++ b/www/common/cryptpad-common.js
@@ -107,8 +107,18 @@ define([
         }
         eraseTempSessionValues();
 
+        logoutHandlers.forEach(function (h) {
+            if (typeof (h) === "function") { h(); }
+        });
+
         if (cb) { cb(); }
     };
+    var logoutHandlers=  [];
+    var onLogout = common.onLogout = function (h) {
+        if (typeof (h) !== "function") { return; }
+        if (logoutHandlers.indexOf(h) !== -1) { return; }
+        logoutHandlers.push(h);
+    };
 
     var getUserHash = common.getUserHash = function () {
         var hash;
@@ -760,6 +770,10 @@ define([
 
     var LOADING = 'loading';
     common.addLoadingScreen = function () {
+        if ($('#' + LOADING).length) {
+            $('#' + LOADING).show();
+            return;
+        }
         var $loading = $('<div>', {id: LOADING});
         var $container = $('<div>', {'class': 'loadingContainer'});
         $container.append('<img class="cryptofist" src="/customize/cryptofist_small.png" />');
@@ -773,9 +787,10 @@ define([
     common.removeLoadingScreen = function (cb) {
         $('#' + LOADING).fadeOut(750, cb);
     };
-    common.errorLoadingScreen = function (error) {
+    common.errorLoadingScreen = function (error, transparent) {
         $('.spinnerContainer').hide();
-        $('#' + LOADING).find('p').text(error || Messages.error);
+        if (transparent) { $('#' + LOADING).css('opacity', 0.8); }
+        $('#' + LOADING).find('p').html(error || Messages.error);
     };
 
     /*
diff --git a/www/common/toolbar.js b/www/common/toolbar.js
index d369e8293..b7b0f54ad 100644
--- a/www/common/toolbar.js
+++ b/www/common/toolbar.js
@@ -49,6 +49,7 @@ define([
 
     var $style;
 
+    var connected = false;
     var firstConnection = true;
     var lagErrors = 0;
 
@@ -453,6 +454,7 @@ define([
                 left: true, // Open to the left of the button
             };
             var $userAdmin = Cryptpad.createDropdown(dropdownConfigUser);
+            $userAdmin.attr('id', 'userDropdown');
             $userContainer.append($userAdmin);
 
             $userAdmin.find('a.logout').click(function (e) {
@@ -522,7 +524,7 @@ define([
             return true;
         });
         $input.on('keyup', function (e) {
-            if (e.which === 13) {
+            if (e.which === 13 && connected === true) {
                 var name = $input.val().trim();
                 if (name === "") {
                     name = $input.attr('placeholder');
@@ -544,6 +546,7 @@ define([
         });
 
         var displayInput = function () {
+            if (connected === false) { return; }
             $text.hide();
             //$pencilIcon.css('display', 'none');
             var inputVal = suggestName() || "";
@@ -575,8 +578,6 @@ define([
         var loadElement;
         var $stateElement = toolbar.find('.' + STATE_CLS);
 
-        var connected = false;
-
         if (config.ifrw) {
             var removeDropdowns =  function (e) {
                 $container.find('.cryptpad-dropdown').hide();
@@ -701,12 +702,21 @@ define([
             checkLag(getLag, lagElement);
         }, 3000);
 
+        var failed = function () {
+            connected = false;
+            $stateElement.text(Messages.disconnected);
+            checkLag(undefined, lagElement);
+        };
+
+        // On log out, remove permanently the realtime elements of the toolbar
+        Cryptpad.onLogout(function () {
+            failed();
+            $userAdminElement.find('#userDropdown').hide();
+            $(userListElement).hide();
+        });
+
         return {
-            failed: function () {
-                connected = false;
-                $stateElement.text(Messages.disconnected);
-                checkLag(undefined, lagElement);
-            },
+            failed: failed,
             reconnecting: function (userId) {
                 myUserName = userId;
                 connected = false;
diff --git a/www/drive/main.js b/www/drive/main.js
index 5e5cb7451..1cdda22f4 100644
--- a/www/drive/main.js
+++ b/www/drive/main.js
@@ -1997,6 +1997,8 @@ define([
         proxy.on('reconnect', function (info) {
             onReconnect(info);
         });
+
+        Cryptpad.onLogout(function () { setEditable(false); });
     });
     Cryptpad.onError(function (info) {
         if (info) {
diff --git a/www/pad/main.js b/www/pad/main.js
index 3998ad915..86eb52449 100644
--- a/www/pad/main.js
+++ b/www/pad/main.js
@@ -754,6 +754,8 @@ define([
 
             var rti = module.realtimeInput = realtimeInput.start(realtimeOptions);
 
+            Cryptpad.onLogout(function () { setEditable(false); });
+
             /* hitting enter makes a new line, but places the cursor inside
                 of the <br> instead of the <p>. This makes it such that you
                 cannot type until you click, which is rather unnacceptable.
diff --git a/www/poll/main.js b/www/poll/main.js
index 3a39da091..abb5f302d 100644
--- a/www/poll/main.js
+++ b/www/poll/main.js
@@ -796,6 +796,8 @@ define([
                 $('#howItWorks').hide();
             }
         });
+
+        //Cryptpad.onLogout(function () { setEditable(false); }); TODO
     });
     Cryptpad.onError(function (info) {
         if (info) {
diff --git a/www/slide/main.js b/www/slide/main.js
index e903ea018..226e0249e 100644
--- a/www/slide/main.js
+++ b/www/slide/main.js
@@ -802,6 +802,8 @@ define([
             var realtime = module.realtime = Realtime.start(config);
 
             editor.on('change', onLocal);
+
+            Cryptpad.onLogout(function () { setEditable(false); });
         };
 
         var interval = 100;