Browse Source

New config setting `locked_muc_nickname`

When set, the "Nickname" field won't be shown in the "Add groupchat"
modal and instead the nickname will be automatically set (based on other
config settings).
JC Brand 6 năm trước cách đây
mục cha
commit
9f290dab25

+ 1 - 0
CHANGES.md

@@ -9,6 +9,7 @@
 - Don't send out receipts or markers for MAM messages
 - Allow setting of debug mode via URL with `/#converse?debug=true`
 - New config setting [locked_muc_domain](https://conversejs.org/docs/html/configuration.html#locked-muc-domain)
+- New config setting [locked_muc_nickname](https://conversejs.org/docs/html/configuration.html#locked-muc-nickname)
 - New config setting [show_client_info](https://conversejs.org/docs/html/configuration.html#show-client-info)
 - Render inline images served over HTTP if Converse itself was loaded on an unsecured (HTTP) page.
 - Document new API method [sendMessage](https://conversejs.org/docs/html/api/-_converse.ChatBox.html#sendMessage)

+ 26 - 6
dist/converse.js

@@ -53797,7 +53797,8 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_6__["default"].plugins
       'auto_list_rooms': false,
       'muc_disable_moderator_commands': false,
       'muc_domain': undefined,
-      'locked_muc_domain': undefined,
+      'locked_muc_nickname': false,
+      'locked_muc_domain': false,
       'muc_show_join_leave': true,
       'roomconfig_whitelist': [],
       'visible_toolbar_buttons': {
@@ -54129,9 +54130,21 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_6__["default"].plugins
         const data = new FormData(form);
         const jid = data.get('chatroom');
         this.model.save('muc_domain', Strophe.getDomainFromJid(jid));
+        let nick;
+
+        if (_converse.locked_muc_nickname) {
+          nick = _converse.getDefaultMUCNickname();
+
+          if (!nick) {
+            throw new Error("Using locked_muc_nickname but no nickname found!");
+          }
+        } else {
+          nick = data.get('nickname').trim();
+        }
+
         return {
           'jid': jid,
-          'nick': data.get('nickname').trim()
+          'nick': nick
         };
       },
 
@@ -66641,8 +66654,10 @@ _converse_core__WEBPACK_IMPORTED_MODULE_3__["default"].plugins.add('converse-muc
     _converse.router.route('converse/room?jid=:jid', openRoom);
 
     _converse.getDefaultMUCNickname = function () {
+      // XXX: if anything changes here, update the docs for the
+      // locked_muc_nickname setting.
       if (!_converse.xmppstatus) {
-        throw new Error("Can't call _converse.getNickname before the statusInitialized has been fired.");
+        throw new Error("Can't call _converse.getDefaultMUCNickname before the statusInitialized has been fired.");
       }
 
       const nick = _converse.nickname || _converse.xmppstatus.vcard.get('nickname');
@@ -92534,20 +92549,25 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*global define
 
 var _ = {escape:__webpack_require__(/*! ./node_modules/lodash/escape.js */ "./node_modules/lodash/escape.js")};
 module.exports = function(o) {
-var __t, __p = '', __e = _.escape;
+var __t, __p = '', __e = _.escape, __j = Array.prototype.join;
+function print() { __p += __j.call(arguments, '') }
 __p += '<!-- src/templates/add_chatroom_modal.html -->\n<div class="modal fade" id="add-chatroom-modal" tabindex="-1" role="dialog" aria-labelledby="add-chatroom-modal-label" aria-hidden="true">\n    <div class="modal-dialog" role="document">\n        <div class="modal-content">\n            <div class="modal-header">\n                <h5 class="modal-title"\n                    id="add-chatroom-modal-label">' +
 __e(o.__('Enter a new Groupchat')) +
 '</h5>\n                <button type="button" class="close" data-dismiss="modal" aria-label="Close">\n                    <span aria-hidden="true">×</span>\n                </button>\n            </div>\n            <div class="modal-body">\n                <form class="converse-form add-chatroom">\n                    <div class="form-group">\n                        <label for="chatroom">' +
 __e(o.label_room_address) +
 ':</label>\n                        <input type="text" required="required" name="chatroom" class="form-control" placeholder="' +
 __e(o.chatroom_placeholder) +
-'"/>\n                    </div>\n                    <div class="form-group" >\n                        <label for="nickname">' +
+'"/>\n                    </div>\n                    ';
+ if (!o._converse.locked_muc_nickname) { ;
+__p += '\n                    <div class="form-group" >\n                        <label for="nickname">' +
 __e(o.__('Nickname')) +
 ':</label>\n                        <input type="text" pattern=".*\\S+.*" title="' +
 __e(o.__('This field is required')) +
 '" required="required" name="nickname" value="' +
 __e(o.nick) +
-'" class="form-control"/>\n                    </div>\n                    <input type="submit" class="btn btn-primary" name="join" value="' +
+'" class="form-control"/>\n                    </div>\n                    ';
+ } ;
+__p += '\n                    <input type="submit" class="btn btn-primary" name="join" value="' +
 __e(o.__('Join')) +
 '"/>\n                </form>\n            </div>\n        </div>\n    </div>\n</div>\n';
 return __p

+ 18 - 2
docs/source/configuration.rst

@@ -886,6 +886,22 @@ locked_muc_domain
 This setting allows you to restrict the multi-user chat (MUC) domain to only the value
 specified in `muc_domain`_.
 
+locked_muc_nickname
+-------------------
+
+* Default: ``false``
+
+This setting allows you to restrict the multi-user chat (MUC) nickname that a
+user uses to a particular value.
+
+Where the nickname value comes from depends on other settings.
+
+The `nickname`_ configuration setting takes precedence ahead of any other
+nickname value. If that's not set, then the "nickname" value from the user's
+VCard is taken, and if that is not set but `muc_nickname_from_jid`_ is set to
+``true``, then the node of the user's JID (the part before the ``@``) is used.
+
+If no nickame value is found, then an error will be raised.
 
 message_archiving
 -----------------
@@ -1042,8 +1058,8 @@ This setting allows you to specify the nickname for the current user.
 The nickname will be included in presence requests to other users and will also
 be used as the default nickname when entering MUC chatrooms.
 
-This value will have first preference (i.e. used instead of any other nickname source,
-such as the VCard `nickname` value).
+This value will have first preference ahead of other nickname sources, such as
+the VCard `nickname` value.
 
 
 notify_all_room_messages

+ 23 - 6
spec/muc.js

@@ -28,11 +28,6 @@
                 expect(u.isVisible(_converse.chatboxviews.get('leisure@localhost').el)).toBeTruthy();
                 expect(u.isVisible(_converse.chatboxviews.get('news@localhost').el)).toBeTruthy();
 
-                // XXX: bit of a cheat here. We want `cleanup()` to be
-                // called on the room. Either it's this or faking
-                // `sendPresence`.
-                _converse.connection.connected = false;
-
                 _converse.api.roomviews.close('lounge@localhost');
                 expect(_converse.chatboxviews.get('lounge@localhost')).toBeUndefined();
                 expect(u.isVisible(_converse.chatboxviews.get('leisure@localhost').el)).toBeTruthy();
@@ -3994,6 +3989,29 @@
                 done();
             }));
 
+            it("doesn't show the nickname field if locked_muc_nickname is true",
+                mock.initConverse(
+                    null, ['rosterGroupsFetched', 'chatBoxesFetched'], {'locked_muc_nickname': true, 'muc_nickname_from_jid': true},
+                    async function (done, _converse) {
+
+                test_utils.openControlBox();
+                await test_utils.waitForRoster(_converse, 'current', 0);
+                const roomspanel = _converse.chatboxviews.get('controlbox').roomspanel;
+                roomspanel.el.querySelector('.show-add-muc-modal').click();
+                test_utils.closeControlBox(_converse);
+                const modal = roomspanel.add_room_modal;
+                await test_utils.waitUntil(() => u.isVisible(modal.el), 1000)
+                const name_input = modal.el.querySelector('input[name="chatroom"]');
+                name_input.value = 'lounge@localhost';
+                expect(modal.el.querySelector('label[for="nickname"]')).toBe(null);
+                expect(modal.el.querySelector('input[name="nickname"]')).toBe(null);
+                modal.el.querySelector('form input[type="submit"]').click();
+                await test_utils.waitUntil(() => _converse.chatboxes.length > 1);
+                const chatroom = _converse.chatboxes.get('lounge@localhost');
+                expect(chatroom.get('nick')).toBe('dummy');
+                done();
+            }));
+
             it("uses the JID node if muc_nickname_from_jid is set to true",
                 mock.initConverse(
                     null, ['rosterGroupsFetched', 'chatBoxesFetched'], {'muc_nickname_from_jid': true},
@@ -4013,7 +4031,6 @@
                 done();
             }));
 
-
             it("uses the nickname passed in to converse.initialize",
                 mock.initConverse(
                     null, ['rosterGroupsFetched', 'chatBoxesFetched'], {'nickname': 'st.nick'},

+ 12 - 2
src/converse-muc-views.js

@@ -104,7 +104,8 @@ converse.plugins.add('converse-muc-views', {
             'auto_list_rooms': false,
             'muc_disable_moderator_commands': false,
             'muc_domain': undefined,
-            'locked_muc_domain': undefined,
+            'locked_muc_nickname': false,
+            'locked_muc_domain': false,
             'muc_show_join_leave': true,
             'roomconfig_whitelist': [],
             'visible_toolbar_buttons': {
@@ -429,9 +430,18 @@ converse.plugins.add('converse-muc-views', {
                 const data = new FormData(form);
                 const jid = data.get('chatroom');
                 this.model.save('muc_domain', Strophe.getDomainFromJid(jid));
+                let nick;
+                if (_converse.locked_muc_nickname) {
+                    nick = _converse.getDefaultMUCNickname();
+                    if (!nick) {
+                        throw new Error("Using locked_muc_nickname but no nickname found!");
+                    }
+                } else {
+                    nick = data.get('nickname').trim();
+                }
                 return {
                     'jid': jid,
-                    'nick': data.get('nickname').trim()
+                    'nick': nick
                 }
             },
 

+ 4 - 1
src/headless/converse-muc.js

@@ -141,8 +141,11 @@ converse.plugins.add('converse-muc', {
 
 
         _converse.getDefaultMUCNickname = function () {
+            // XXX: if anything changes here, update the docs for the
+            // locked_muc_nickname setting.
             if (!_converse.xmppstatus) {
-                throw new Error("Can't call _converse.getNickname before the statusInitialized has been fired.");
+                throw new Error(
+                    "Can't call _converse.getDefaultMUCNickname before the statusInitialized has been fired.");
             }
             const nick = _converse.nickname || _converse.xmppstatus.vcard.get('nickname');
             if (nick) {

+ 2 - 0
src/templates/add_chatroom_modal.html

@@ -14,10 +14,12 @@
                         <label for="chatroom">{{{o.label_room_address}}}:</label>
                         <input type="text" required="required" name="chatroom" class="form-control" placeholder="{{{o.chatroom_placeholder}}}"/>
                     </div>
+                    {[ if (!o._converse.locked_muc_nickname) { ]}
                     <div class="form-group" >
                         <label for="nickname">{{{o.__('Nickname')}}}:</label>
                         <input type="text" pattern=".*\S+.*" title="{{{o.__('This field is required')}}}" required="required" name="nickname" value="{{{o.nick}}}" class="form-control"/>
                     </div>
+                    {[ } ]}
                     <input type="submit" class="btn btn-primary" name="join" value="{{{o.__('Join')}}}"/>
                 </form>
             </div>

+ 0 - 1
tests/index.html

@@ -7,7 +7,6 @@
     <link rel="shortcut icon" type="image/png" href="../node_modules/jasmine-core/images/jasmine_favicon.png">
 
     <link rel="stylesheet" type="text/css" media="screen" href="../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
-    <link type="text/css" rel="stylesheet" media="screen" href="../node_modules/font-awesome/css/font-awesome.min.css" />
     <link rel="stylesheet" type="text/css" media="screen" href="../css/jasmine.css">
     <link type="text/css" rel="stylesheet" media="screen" href="../css/website.css" />
     <link type="text/css" rel="stylesheet" media="screen" href="../css/converse.css" />