Browse Source

Add the `/register` command for registering yourself

JC Brand 7 years ago
parent
commit
71370f5b45
3 changed files with 87 additions and 13 deletions
  1. 65 1
      spec/room_registration.js
  2. 11 3
      src/converse-muc-views.js
  3. 11 9
      src/converse-muc.js

+ 65 - 1
spec/room_registration.js

@@ -8,9 +8,73 @@
           u = converse.env.utils;
 
     describe("Chatrooms", function () {
+
+
+        describe("The /register commmand", function () {
+
+            it("allows you to register your nickname in a room",
+                mock.initConverseWithPromises(
+                    null, ['rosterGroupsFetched', 'chatBoxesFetched'], {'auto_register_muc_nickname': true},
+                    function (done, _converse) {
+
+                let view;
+                const room_jid = 'coven@chat.shakespeare.lit';
+                test_utils.openAndEnterChatRoom(_converse, 'coven', 'chat.shakespeare.lit', 'romeo')
+                .then(() => {
+                    view = _converse.chatboxviews.get(room_jid);
+                    const textarea = view.el.querySelector('.chat-textarea')
+                    textarea.value = '/register';
+                    view.keyPressed({
+                        target: textarea,
+                        preventDefault: _.noop,
+                        keyCode: 13
+                    });
+                    return test_utils.waitUntil(() => _.get(_.filter(
+                        _converse.connection.IQ_stanzas,
+                        iq => sizzle(`iq[to="coven@chat.shakespeare.lit"][type="get"] query[xmlns="jabber:iq:register"]`, iq.nodeTree).length
+                    ).pop(), 'nodeTree'));
+                }).then(stanza => {
+                    expect(stanza.outerHTML)
+                    .toBe(`<iq to="coven@chat.shakespeare.lit" from="dummy@localhost/resource" `+
+                                `type="get" xmlns="jabber:client" id="${stanza.getAttribute('id')}">`+
+                            `<query xmlns="jabber:iq:register"/></iq>`);
+                    view = _converse.chatboxviews.get(room_jid);
+                    const result = $iq({
+                        'from': view.model.get('jid'),
+                        'id': stanza.getAttribute('id'),
+                        'to': _converse.bare_jid,
+                        'type': 'result',
+                    }).c('query', {'type': 'jabber:iq:register'})
+                        .c('x', {'xmlns': 'jabber:x:data', 'type': 'form'})
+                            .c('field', {
+                                'label': 'Desired Nickname',
+                                'type': 'text-single',
+                                'var': 'muc#register_roomnick'
+                            }).c('required');
+                    _converse.connection._dataRecv(test_utils.createRequest(result));
+                    return test_utils.waitUntil(() => _.get(_.filter(
+                        _converse.connection.IQ_stanzas,
+                        iq => sizzle(`iq[to="coven@chat.shakespeare.lit"][type="set"] query[xmlns="jabber:iq:register"]`, iq.nodeTree).length
+                    ).pop(), 'nodeTree'));
+                }).then(stanza => {
+                    expect(stanza.outerHTML).toBe(
+                        `<iq to="coven@chat.shakespeare.lit" from="dummy@localhost/resource" type="set" xmlns="jabber:client" id="${stanza.getAttribute('id')}">`+
+                            `<query xmlns="jabber:iq:register">`+
+                                `<x xmlns="jabber:x:data" type="submit">`+
+                                    `<field var="FORM_TYPE"><value>http://jabber.org/protocol/muc#register</value></field>`+
+                                    `<field var="muc#register_roomnick"><value>romeo</value></field>`+
+                                `</x>`+
+                            `</query>`+
+                        `</iq>`);
+                    done();
+                }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+            }));
+
+        });
+
         describe("The auto_register_muc_nickname option", function () {
 
-            it("allows you to automatically register your nickname when joining a room", 
+            it("allows you to automatically register your nickname when joining a room",
                 mock.initConverseWithPromises(
                     null, ['rosterGroupsFetched', 'chatBoxesFetched'], {'auto_register_muc_nickname': true},
                     function (done, _converse) {

+ 11 - 3
src/converse-muc-views.js

@@ -241,7 +241,7 @@
                 el.querySelector('span.spinner').remove();
                 el.querySelector('a.room-info').classList.add('selected');
                 el.insertAdjacentHTML(
-                    'beforeEnd', 
+                    'beforeEnd',
                     tpl_room_description({
                         'jid': stanza.getAttribute('from'),
                         'desc': _.get(_.head(sizzle('field[var="muc#roominfo_description"] value', stanza)), 'textContent'),
@@ -290,7 +290,7 @@
                 }
             }
 
-            
+
             _converse.ListChatRoomsModal = _converse.BootstrapModal.extend({
 
                 events: {
@@ -880,7 +880,7 @@
                         return false;
                     }
                     const match = text.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false, '', ''],
-                          args = match[2] && match[2].splitOnce(' ') || [],
+                          args = match[2] && match[2].splitOnce(' ').filter(s => s) || [],
                           command = match[1].toLowerCase();
                     switch (command) {
                         case 'admin':
@@ -930,6 +930,7 @@
                                 `<strong>/nick</strong>: ${__('Change your nickname')}`,
                                 `<strong>/op</strong>: ${__('Grant moderator role to user')}`,
                                 `<strong>/owner</strong>: ${__('Grant ownership of this groupchat')}`,
+                                `<strong>/register</strong>: ${__("Register a nickname for this room")}`,
                                 `<strong>/revoke</strong>: ${__("Revoke user's membership")}`,
                                 `<strong>/subject</strong>: ${__('Set groupchat subject')}`,
                                 `<strong>/topic</strong>: ${__('Set groupchat subject (alias for /subject)')}`,
@@ -997,6 +998,13 @@
                                     this.model.get('jid'), args[0], 'moderator', args[1],
                                     undefined, this.onCommandError.bind(this));
                             break;
+                        case 'register':
+                            if (args.length > 1) {
+                                this.showErrorMessage(__(`Error: invalid number of arguments`))
+                            } else {
+                                this.model.registerNickname();
+                            }
+                            break;
                         case 'revoke':
                             if (!this.verifyAffiliations(['admin', 'owner']) || !this.validateRoleChangeCommand(command, args)) {
                                 break;

+ 11 - 9
src/converse-muc.js

@@ -810,45 +810,47 @@
                 },
 
                 async registerNickname () {
+                    const nick = this.get('nick'),
+                          jid = this.get('jid');
                     let iq;
                     try {
                         iq = await _converse.api.sendIQ(
                             $iq({
-                                'to': this.get('jid'),
+                                'to': jid,
                                 'from': _converse.connection.jid,
                                 'type': 'get'
                             }).c('query', {'xmlns': Strophe.NS.MUC_REGISTER})
                         );
                     } catch (e) {
                         if (sizzle('item-not-found[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', e).length) {
-                            _converse.log(`Can't register nickname ${this.get('nick')} in the groupchat ${this.get('jid')} which does not exist.`);
+                            _converse.log(`Can't register nickname ${nick} in the groupchat ${jid} which does not exist.`);
                         } else if (sizzle('not-allowed[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', e).length) {
-                            _converse.log(`You're not allowed to register in the groupchat ${this.get('jid')}`);
+                            _converse.log(`You're not allowed to register in the groupchat ${jid}`);
                         }
                         return _converse.log(e, Strophe.LogLevel.ERROR);
                     }
 
                     const required_fields = _.map(sizzle('field required', iq), 'parentElement');
                     if (required_fields.length > 1 || required_fields[0].getAttribute('var') !== 'muc#register_roomnick') {
-                        return _converse.log(`Can't register the user register in the groupchat ${this.get('jid')} due to the required fields`);
+                        return _converse.log(`Can't register the user register in the groupchat ${jid} due to the required fields`);
                     }
                     try {
                         await _converse.api.sendIQ($iq({
-                                'to': this.get('jid'),
+                                'to': jid,
                                 'from': _converse.connection.jid,
                                 'type': 'set'
                             }).c('query', {'xmlns': Strophe.NS.MUC_REGISTER})
                                 .c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'})
                                     .c('field', {'var': 'FORM_TYPE'}).c('value').t('http://jabber.org/protocol/muc#register').up().up()
-                                    .c('field', {'var': 'muc#register_roomnick'}).c('value').t(this.get('nick'))
+                                    .c('field', {'var': 'muc#register_roomnick'}).c('value').t(nick)
                         );
                     } catch (e) {
                         if (sizzle('conflict[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', e).length) {
-                            _converse.log(`Can't register nickname ${this.get('nick')} in the groupchat ${this.get('jid')}, it's already taken.`);
+                            _converse.log(`Can't register nickname ${nick} in the groupchat ${jid}, it's already taken.`);
                         } else if (sizzle('service-unavailable[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', e).length) {
-                            _converse.log(`Can't register nickname ${this.get('nick')} in the groupchat ${this.get('jid')}, it doesn't support registration.`);
+                            _converse.log(`Can't register nickname ${nick} in the groupchat ${jid}, it doesn't support registration.`);
                         } else if (sizzle('bad-request[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]', e).length) {
-                            _converse.log(`Can't register nickname ${this.get('nick')} in the groupchat ${this.get('jid')}, invalid data form supplied.`);
+                            _converse.log(`Can't register nickname ${nick} in the groupchat ${jid}, invalid data form supplied.`);
                         }
                         return _converse.log(e, Strophe.LogLevel.ERROR);
                     }