浏览代码

escape nicknames before displaying them

j8
isymchych 9 年前
父节点
当前提交
0bcbd105e3

+ 13
- 9
modules/UI/UI.js 查看文件

@@ -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) {
@@ -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 查看文件

@@ -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
     },

+ 1
- 1
modules/UI/side_pannels/chat/Chat.js 查看文件

@@ -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
             }

+ 1
- 1
modules/UI/side_pannels/contactlist/ContactList.js 查看文件

@@ -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
 

+ 1
- 1
modules/UI/side_pannels/settings/SettingsMenu.js 查看文件

@@ -40,7 +40,7 @@ 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 45
             if (displayName && Settings.getDisplayName() !== displayName) {
46 46
                 emitter.emit(UIEvents.NICKNAME_CHANGED, displayName);

+ 3
- 3
modules/UI/util/MessageHandler.js 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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;

正在加载...
取消
保存