Explorar el Código

Merge pull request #494 from isymchych/escape-nicknames

Escape nicknames before displaying them
master
Paweł Domas hace 10 años
padre
commit
1a656c2c89

+ 7
- 1
conference.js Ver fichero

@@ -860,7 +860,13 @@ export default {
860 860
             APP.UI.setUserAvatar(data.attributes.id, data.value);
861 861
         });
862 862
 
863
-        APP.UI.addListener(UIEvents.NICKNAME_CHANGED, (nickname) => {
863
+        APP.UI.addListener(UIEvents.NICKNAME_CHANGED, (nickname = '') => {
864
+            nickname = nickname.trim();
865
+
866
+            if (nickname === APP.settings.getDisplayName()) {
867
+                return;
868
+            }
869
+
864 870
             APP.settings.setDisplayName(nickname);
865 871
             room.setDisplayName(nickname);
866 872
             APP.UI.changeDisplayName(APP.conference.localId, nickname);

+ 15
- 0
css/chat.css Ver fichero

@@ -22,6 +22,9 @@
22 22
     overflow-x: hidden;
23 23
     word-wrap: break-word;
24 24
 }
25
+#chatspace.is-conversation-mode #chatconversation {
26
+    visibility: visible;
27
+}
25 28
 
26 29
 .localuser {
27 30
     color: #087dba;
@@ -61,6 +64,10 @@
61 64
     box-shadow: none;
62 65
 }
63 66
 
67
+#chatspace.is-conversation-mode #usermsg {
68
+    visibility: visible;
69
+}
70
+
64 71
 #nickname {
65 72
     position: absolute;
66 73
     text-align: center;
@@ -72,6 +79,10 @@
72 79
     width: 95%;
73 80
 }
74 81
 
82
+#chatspace.is-conversation-mode #nickname {
83
+    visibility: hidden;
84
+}
85
+
75 86
 #nickinput {
76 87
     margin-top: 20px;
77 88
     font-size: 14px;
@@ -168,6 +179,10 @@
168 179
     visibility: hidden;
169 180
 }
170 181
 
182
+#chatspace.is-conversation-mode #smileysarea {
183
+    visibility: visible;
184
+}
185
+
171 186
 #smileysContainer {
172 187
     display: none;
173 188
     position: absolute;

+ 14
- 10
modules/UI/UI.js Ver fichero

@@ -223,12 +223,13 @@ UI.changeDisplayName = function (id, displayName) {
223 223
  * Intitialize conference UI.
224 224
  */
225 225
 UI.initConference = function () {
226
-    var id = APP.conference.localId;
226
+    let id = APP.conference.localId;
227 227
     Toolbar.updateRoomUrl(window.location.href);
228
-    var meHTML = APP.translation.generateTranslationHTML("me");
229
-    var settings = Settings.getSettings();
228
+    let meHTML = APP.translation.generateTranslationHTML("me");
230 229
 
231
-    $("#localNick").html(settings.email || settings.uid + " (" + meHTML + ")");
230
+    let email = Settings.getEmail();
231
+    let uid = Settings.getUserId();
232
+    $("#localNick").html(email || `${uid} (${meHTML})`);
232 233
 
233 234
     // Add myself to the contact list.
234 235
     ContactList.addContact(id);
@@ -236,14 +237,14 @@ UI.initConference = function () {
236 237
     // Once we've joined the muc show the toolbar
237 238
     ToolbarToggler.showToolbar();
238 239
 
239
-    var displayName = config.displayJids ? id : settings.displayName;
240
+    let displayName = config.displayJids ? id : Settings.getDisplayName();
240 241
 
241 242
     if (displayName) {
242 243
         UI.changeDisplayName('localVideoContainer', displayName);
243 244
     }
244 245
 
245 246
     // Make sure we configure our avatar id, before creating avatar for us
246
-    UI.setUserAvatar(id, settings.email);
247
+    UI.setUserAvatar(id, email);
247 248
 
248 249
     Toolbar.checkAutoEnableDesktopSharing();
249 250
     if(!interfaceConfig.filmStripOnly) {
@@ -559,7 +560,7 @@ UI.updateUserRole = function (user) {
559 560
         messageHandler.notify(
560 561
             displayName, 'notify.somebody',
561 562
             'connected', 'notify.grantedTo', {
562
-                to: displayName
563
+                to: UIUtil.escapeHtml(displayName)
563 564
             }
564 565
         );
565 566
     } else {
@@ -607,8 +608,11 @@ UI.toggleContactList = function () {
607 608
     PanelToggler.toggleContactList();
608 609
 };
609 610
 
610
-UI.inputDisplayNameHandler = function (value) {
611
-    VideoLayout.inputDisplayNameHandler(value);
611
+/**
612
+ * Handle new user display name.
613
+ */
614
+UI.inputDisplayNameHandler = function (newDisplayName) {
615
+    eventEmitter.emit(UIEvents.NICKNAME_CHANGED, newDisplayName);
612 616
 };
613 617
 
614 618
 /**
@@ -888,7 +892,7 @@ UI.inviteParticipants = function (roomUrl, conferenceName, key, nick) {
888 892
     body = body.replace(/\n/g, "%0D%0A");
889 893
 
890 894
     if (nick) {
891
-        body += "%0D%0A%0D%0A" + nick;
895
+        body += "%0D%0A%0D%0A" + UIUtil.escapeHtml(nick);
892 896
     }
893 897
 
894 898
     if (interfaceConfig.INVITATION_POWERED_BY) {

+ 2
- 3
modules/UI/side_pannels/SidePanelToggler.js Ver fichero

@@ -148,9 +148,8 @@ var PanelToggler = {
148 148
             '#settingsmenu',
149 149
             null,
150 150
             function() {
151
-                var settings = Settings.getSettings();
152
-                $('#setDisplayName').get(0).value = settings.displayName;
153
-                $('#setEmail').get(0).value = settings.email;
151
+                $('#setDisplayName').val(Settings.getDisplayName());
152
+                $('#setEmail').val(Settings.getEmail());
154 153
             },
155 154
             null);
156 155
     },

+ 4
- 5
modules/UI/side_pannels/chat/Chat.js Ver fichero

@@ -179,7 +179,7 @@ var Chat = {
179 179
         $('#nickinput').keydown(function (event) {
180 180
             if (event.keyCode === 13) {
181 181
                 event.preventDefault();
182
-                var val = UIUtil.escapeHtml(this.value);
182
+                let val = this.value;
183 183
                 this.value = '';
184 184
                 eventEmitter.emit(UIEvents.NICKNAME_CHANGED, val);
185 185
             }
@@ -292,13 +292,12 @@ var Chat = {
292 292
 
293 293
     /**
294 294
      * Sets the chat conversation mode.
295
+     * @param {boolean} isConversationMode if chat should be in
296
+     * conversation mode or not.
295 297
      */
296 298
     setChatConversationMode (isConversationMode) {
299
+        $('#chatspace').toggleClass('is-conversation-mode', isConversationMode);
297 300
         if (isConversationMode) {
298
-            $('#nickname').css({visibility: 'hidden'});
299
-            $('#chatconversation').css({visibility: 'visible'});
300
-            $('#usermsg').css({visibility: 'visible'});
301
-            $('#smileysarea').css({visibility: 'visible'});
302 301
             $('#usermsg').focus();
303 302
         }
304 303
     },

+ 1
- 1
modules/UI/side_pannels/contactlist/ContactList.js Ver fichero

@@ -158,7 +158,7 @@ var ContactList = {
158 158
         let contactName = $(`#contacts #${id}>p`);
159 159
 
160 160
         if (displayName) {
161
-            contactName.html(displayName);
161
+            contactName.text(displayName);
162 162
         }
163 163
     },
164 164
 

+ 2
- 4
modules/UI/side_pannels/settings/SettingsMenu.js Ver fichero

@@ -40,11 +40,9 @@ function generateDevicesOptions(items, selectedId) {
40 40
 export default {
41 41
     init (emitter) {
42 42
         function update() {
43
-            let displayName = UIUtil.escapeHtml($('#setDisplayName').val());
43
+            let displayName = $('#setDisplayName').val();
44 44
 
45
-            if (displayName && Settings.getDisplayName() !== displayName) {
46
-                emitter.emit(UIEvents.NICKNAME_CHANGED, displayName);
47
-            }
45
+            emitter.emit(UIEvents.NICKNAME_CHANGED, displayName);
48 46
 
49 47
             let language = $("#languages_selectbox").val();
50 48
             if (language !== Settings.getLanguage()) {

+ 3
- 3
modules/UI/util/MessageHandler.js Ver fichero

@@ -1,6 +1,8 @@
1 1
 /* global $, APP, jQuery, toastr, Impromptu */
2 2
 /* jshint -W101 */
3 3
 
4
+import UIUtil from './UIUtil';
5
+
4 6
 /**
5 7
  * Flag for enable/disable of the notifications.
6 8
  * @type {boolean}
@@ -204,7 +206,7 @@ var messageHandler = (function(my) {
204 206
             return;
205 207
         var displayNameSpan = '<span class="nickname" ';
206 208
         if (displayName) {
207
-            displayNameSpan += ">" + displayName;
209
+            displayNameSpan += ">" + UIUtil.escapeHtml(displayName);
208 210
         } else {
209 211
             displayNameSpan += "data-i18n='" + displayNameKey +
210 212
                 "'>" + APP.translation.translateString(displayNameKey);
@@ -247,5 +249,3 @@ var messageHandler = (function(my) {
247 249
 }(messageHandler || {}));
248 250
 
249 251
 module.exports = messageHandler;
250
-
251
-

+ 10
- 0
modules/UI/util/UIUtil.js Ver fichero

@@ -72,6 +72,16 @@
72 72
         return $('<div/>').text(unsafeText).html();
73 73
     },
74 74
 
75
+    /**
76
+     * Unescapes the given text.
77
+     *
78
+     * @param {string} safe string which contains escaped html
79
+     * @returns {string} unescaped html string.
80
+     */
81
+    unescapeHtml: function (safe) {
82
+        return $('<div />').html(safe).text();
83
+    },
84
+
75 85
     imageToGrayScale: function (canvas) {
76 86
         var context = canvas.getContext('2d');
77 87
         var imgData = context.getImageData(0, 0, canvas.width, canvas.height);

+ 5
- 7
modules/UI/videolayout/LocalVideo.js Ver fichero

@@ -65,7 +65,9 @@ LocalVideo.prototype.setDisplayName = function(displayName, key) {
65 65
         if (nameSpan.text() !== displayName) {
66 66
             if (displayName && displayName.length > 0) {
67 67
                 meHTML = APP.translation.generateTranslationHTML("me");
68
-                $('#localDisplayName').html(displayName + ' (' + meHTML + ')');
68
+                $('#localDisplayName').html(
69
+                    UIUtil.escapeHtml(displayName) + ' (' + meHTML + ')'
70
+                );
69 71
             } else {
70 72
                 $('#localDisplayName').html(defaultLocalDisplayName);
71 73
             }
@@ -81,7 +83,7 @@ LocalVideo.prototype.setDisplayName = function(displayName, key) {
81 83
 
82 84
         if (displayName && displayName.length > 0) {
83 85
             meHTML = APP.translation.generateTranslationHTML("me");
84
-            nameSpan.innerHTML = displayName + meHTML;
86
+            nameSpan.innerHTML = UIUtil.escapeHtml(displayName) + meHTML;
85 87
         }
86 88
         else {
87 89
             nameSpan.innerHTML = defaultLocalDisplayName;
@@ -126,7 +128,7 @@ LocalVideo.prototype.setDisplayName = function(displayName, key) {
126 128
                 editDisplayName.select();
127 129
 
128 130
                 editDisplayName.one("focusout", function (e) {
129
-                    self.VideoLayout.inputDisplayNameHandler(this.value);
131
+                    self.emitter.emit(UIEvents.NICKNAME_CHANGED, this.value);
130 132
                     $('#editDisplayName').hide();
131 133
                 });
132 134
 
@@ -141,10 +143,6 @@ LocalVideo.prototype.setDisplayName = function(displayName, key) {
141 143
     }
142 144
 };
143 145
 
144
-LocalVideo.prototype.inputDisplayNameHandler = function (name) {
145
-    this.emitter.emit(UIEvents.NICKNAME_CHANGED, UIUtil.escapeHtml(name));
146
-};
147
-
148 146
 LocalVideo.prototype.createConnectionIndicator = function() {
149 147
     if(this.connectionIndicator)
150 148
         return;

+ 4
- 4
modules/UI/videolayout/RemoteVideo.js Ver fichero

@@ -359,7 +359,7 @@ RemoteVideo.prototype.setDisplayName = function(displayName, key) {
359 359
     // If we already have a display name for this video.
360 360
     if (nameSpan.length > 0) {
361 361
         if (displayName && displayName.length > 0) {
362
-            $('#' + this.videoSpanId + '_name').html(displayName);
362
+            $('#' + this.videoSpanId + '_name').text(displayName);
363 363
         }
364 364
         else if (key && key.length > 0) {
365 365
             var nameHtml = APP.translation.generateTranslationHTML(key);
@@ -374,10 +374,10 @@ RemoteVideo.prototype.setDisplayName = function(displayName, key) {
374 374
         $('#' + this.videoSpanId)[0].appendChild(nameSpan);
375 375
 
376 376
         if (displayName && displayName.length > 0) {
377
-            nameSpan.innerHTML = displayName;
378
-        }
379
-        else
377
+            $(nameSpan).text(displayName);
378
+        } else {
380 379
             nameSpan.innerHTML = interfaceConfig.DEFAULT_REMOTE_DISPLAY_NAME;
380
+        }
381 381
         nameSpan.id = this.videoSpanId + '_name';
382 382
     }
383 383
 };

+ 0
- 5
modules/UI/videolayout/VideoLayout.js Ver fichero

@@ -347,11 +347,6 @@ var VideoLayout = {
347 347
         }
348 348
     },
349 349
 
350
-
351
-    inputDisplayNameHandler (name) {
352
-        localVideoThumbnail.inputDisplayNameHandler(name);
353
-    },
354
-
355 350
     videoactive (videoelem, resourceJid) {
356 351
 
357 352
         console.info(resourceJid + " video is now active", videoelem);

+ 14
- 10
modules/settings/Settings.js Ver fichero

@@ -1,4 +1,5 @@
1 1
 import {generateUsername} from '../util/UsernameGenerator';
2
+import UIUtil from '../UI/util/UIUtil';
2 3
 
3 4
 let email = '';
4 5
 let displayName = '';
@@ -32,7 +33,7 @@ if (supportsLocalStorage()) {
32 33
 
33 34
     userId = window.localStorage.jitsiMeetId || '';
34 35
     email = window.localStorage.email || '';
35
-    displayName = window.localStorage.displayname || '';
36
+    displayName = UIUtil.unescapeHtml(window.localStorage.displayname || '');
36 37
     language = window.localStorage.language;
37 38
     cameraDeviceId = window.localStorage.cameraDeviceId || '';
38 39
     micDeviceId = window.localStorage.micDeviceId || '';
@@ -46,26 +47,29 @@ export default {
46 47
     /**
47 48
      * Sets the local user display name and saves it to local storage
48 49
      *
49
-     * @param newDisplayName the new display name for the local user
50
-     * @returns {string} the display name we just set
50
+     * @param {string} newDisplayName unescaped display name for the local user
51 51
      */
52
-    setDisplayName: function (newDisplayName) {
53
-        if (displayName === newDisplayName) {
54
-            return displayName;
55
-        }
52
+    setDisplayName (newDisplayName) {
56 53
         displayName = newDisplayName;
57
-        window.localStorage.displayname = displayName;
58
-        return displayName;
54
+        window.localStorage.displayname = UIUtil.escapeHtml(displayName);
59 55
     },
60 56
 
61 57
     /**
62
-     * Returns the currently used by the user
58
+     * Returns the escaped display name currently used by the user
63 59
      * @returns {string} currently valid user display name.
64 60
      */
65 61
     getDisplayName: function () {
66 62
         return displayName;
67 63
     },
68 64
 
65
+    /**
66
+     * Returns id of the user.
67
+     * @returns {string} user id
68
+     */
69
+    getUserId () {
70
+        return userId;
71
+    },
72
+
69 73
     setEmail: function (newEmail) {
70 74
         email = newEmail;
71 75
         window.localStorage.email = newEmail;

Loading…
Cancelar
Guardar