Browse Source

Updated build

JC Brand 6 năm trước cách đây
mục cha
commit
aeb0c0c7bb
1 tập tin đã thay đổi với 140 bổ sung77 xóa
  1. 140 77
      dist/converse.js

+ 140 - 77
dist/converse.js

@@ -64742,6 +64742,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           this.features = new Backbone.Collection();
           this.features.browserStorage = new Backbone.BrowserStorage.session(b64_sha1(`converse.features-${this.get('jid')}`));
           this.features.on('add', this.onFeatureAdded, this);
+          this.fields = new Backbone.Collection();
+          this.fields.browserStorage = new Backbone.BrowserStorage.session(b64_sha1(`converse.fields-${this.get('jid')}`));
+          this.fields.on('add', this.onFieldAdded, this);
           this.identities = new Backbone.Collection();
           this.identities.browserStorage = new Backbone.BrowserStorage.session(b64_sha1(`converse.identities-${this.get('jid')}`));
           this.fetchFeatures();
@@ -64801,6 +64804,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           _converse.emit('serviceDiscovered', feature);
         },
 
+        onFieldAdded(field) {
+          field.entity = this;
+
+          _converse.emit('discoExtensionFieldDiscovered', field);
+        },
+
         fetchFeatures() {
           if (this.features.browserStorage.records.length === 0) {
             this.queryInfo();
@@ -64893,6 +64902,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
               'var': feature.getAttribute('var'),
               'from': stanza.getAttribute('from')
             });
+          }); // XEP-0128 Service Discovery Extensions
+
+
+          _.forEach(sizzle('x[type="result"][xmlns="jabber:x:data"] field', stanza), field => {
+            this.fields.create({
+              'var': field.getAttribute('var'),
+              'value': _.get(field.querySelector('value'), 'textContent'),
+              'from': stanza.getAttribute('from')
+            });
           });
 
           this.waitUntilFeaturesDiscovered.resolve(this);
@@ -65309,7 +65327,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
            */
           'supports'(feature, jid) {
             if (_.isNil(jid)) {
-              throw new TypeError('disco.supports: You need to provide an entity JID');
+              throw new TypeError('api.disco.supports: You need to provide an entity JID');
             }
 
             return _converse.api.waitUntil('discoInitialized').then(() => _converse.api.disco.entities.get(jid, true)).then(entity => entity.waitUntilFeaturesDiscovered).then(entity => {
@@ -65319,6 +65337,41 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
             }).then(result => f.filter(f.isObject, result));
           },
 
+          /**
+           * Return all the features associated with a disco entity
+           *
+           * @method _converse.api.disco.getFeatures
+           * @param {string} jid The JID of the entity whose features are returned.
+           * @example
+           * const features = await _converse.api.disco.getFeatures('room@conference.example.org');
+           */
+          'getFeatures'(jid) {
+            if (_.isNil(jid)) {
+              throw new TypeError('api.disco.getFeatures: You need to provide an entity JID');
+            }
+
+            return _converse.api.waitUntil('discoInitialized').then(() => _converse.api.disco.entities.get(jid, true)).then(entity => entity.waitUntilFeaturesDiscovered).then(entity => entity.features).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+          },
+
+          /**
+           * Return all the service discovery extensions fields
+           * associated with an entity.
+           *
+           * See [XEP-0129: Service Discovery Extensions](https://xmpp.org/extensions/xep-0128.html)
+           *
+           * @method _converse.api.disco.getFields
+           * @param {string} jid The JID of the entity whose fields are returned.
+           * @example
+           * const fields = await _converse.api.disco.getFields('room@conference.example.org');
+           */
+          'getFields'(jid) {
+            if (_.isNil(jid)) {
+              throw new TypeError('api.disco.getFields: You need to provide an entity JID');
+            }
+
+            return _converse.api.waitUntil('discoInitialized').then(() => _converse.api.disco.entities.get(jid, true)).then(entity => entity.waitUntilFeaturesDiscovered).then(entity => entity.fields).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
+          },
+
           /**
            * Get the identity (with the given category and type) for a given disco entity.
            *
@@ -68678,7 +68731,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           }
 
           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) {
@@ -68713,7 +68766,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
               break;
 
             case 'help':
-              this.showHelpMessages([`<strong>/admin</strong>: ${__("Change user's affiliation to admin")}`, `<strong>/ban</strong>: ${__('Ban user from groupchat')}`, `<strong>/clear</strong>: ${__('Remove messages')}`, `<strong>/deop</strong>: ${__('Change user role to participant')}`, `<strong>/help</strong>: ${__('Show this menu')}`, `<strong>/kick</strong>: ${__('Kick user from groupchat')}`, `<strong>/me</strong>: ${__('Write in 3rd person')}`, `<strong>/member</strong>: ${__('Grant membership to a user')}`, `<strong>/mute</strong>: ${__("Remove user's ability to post messages")}`, `<strong>/nick</strong>: ${__('Change your nickname')}`, `<strong>/op</strong>: ${__('Grant moderator role to user')}`, `<strong>/owner</strong>: ${__('Grant ownership of this groupchat')}`, `<strong>/revoke</strong>: ${__("Revoke user's membership")}`, `<strong>/subject</strong>: ${__('Set groupchat subject')}`, `<strong>/topic</strong>: ${__('Set groupchat subject (alias for /subject)')}`, `<strong>/voice</strong>: ${__('Allow muted user to post messages')}`]);
+              this.showHelpMessages([`<strong>/admin</strong>: ${__("Change user's affiliation to admin")}`, `<strong>/ban</strong>: ${__('Ban user from groupchat')}`, `<strong>/clear</strong>: ${__('Remove messages')}`, `<strong>/deop</strong>: ${__('Change user role to participant')}`, `<strong>/help</strong>: ${__('Show this menu')}`, `<strong>/kick</strong>: ${__('Kick user from groupchat')}`, `<strong>/me</strong>: ${__('Write in 3rd person')}`, `<strong>/member</strong>: ${__('Grant membership to a user')}`, `<strong>/mute</strong>: ${__("Remove user's ability to post messages")}`, `<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)')}`, `<strong>/voice</strong>: ${__('Allow muted user to post messages')}`]);
               break;
 
             case 'kick':
@@ -68742,11 +68795,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
                   'nick': args[0]
                 }) || this.model.occupants.findWhere({
                   'jid': args[0]
-                });
-                this.model.setAffiliation('member', [{
+                }),
+                      attrs = {
                   'jid': occupant.get('jid'),
                   'reason': args[1]
-                }]).then(() => this.model.occupants.fetchMembers(), err => this.onCommandError(err));
+                };
+
+                if (_converse.auto_register_muc_nickname) {
+                  attrs['nick'] = occupant.get('nick');
+                }
+
+                this.model.setAffiliation('member', [attrs]).then(() => this.model.occupants.fetchMembers()).catch(err => this.onCommandError(err));
                 break;
               }
 
@@ -68782,6 +68841,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
               this.modifyRole(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;
@@ -68926,7 +68994,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           });
           form_el.addEventListener('submit', ev => {
             ev.preventDefault();
-            this.model.saveConfiguration(ev.target).then(this.model.getRoomFeatures.bind(this.model));
+            this.model.saveConfiguration(ev.target).then(() => this.model.refreshRoomFeatures());
             this.closeForm();
           }, false);
         },
@@ -70208,6 +70276,12 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
           this.occupants.reset();
 
+          const disco_entity = _converse.disco_entities.get(this.get('jid'));
+
+          if (disco_entity) {
+            disco_entity.destroy();
+          }
+
           if (_converse.connection.connected) {
             this.sendUnavailablePresence(exit_msg);
           }
@@ -70330,21 +70404,6 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
           };
         },
 
-        getRoomFeatures() {
-          /* Fetch the groupchat disco info, parse it and then save it.
-           */
-          // XXX: Currently we store disco info on the room itself.
-          // A better design would probably be to create a
-          // DiscoEntity for this room, and then to let
-          // converse-disco manage all disco-related tasks.
-          // Then we can also use _converse.api.disco.supports.
-          return _converse.api.disco.info(this.get('jid'), null).then(stanza => this.parseRoomFeatures(stanza)).catch(err => {
-            _converse.log("Could not parse the groupchat features", Strophe.LogLevel.WARN);
-
-            _converse.log(err, Strophe.LogLevel.WARN);
-          });
-        },
-
         getRoomJIDAndNick(nick) {
           /* Utility method to construct the JID for the current user
            * as occupant of the groupchat.
@@ -70447,50 +70506,41 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
           });
         },
 
-        parseRoomFeatures(iq) {
-          /* Parses an IQ stanza containing the groupchat's features.
-           *
-           * See http://xmpp.org/extensions/xep-0045.html#disco-roominfo
-           *
-           *  <identity
-           *      category='conference'
-           *      name='A Dark Cave'
-           *      type='text'/>
-           *  <feature var='http://jabber.org/protocol/muc'/>
-           *  <feature var='muc_passwordprotected'/>
-           *  <feature var='muc_hidden'/>
-           *  <feature var='muc_temporary'/>
-           *  <feature var='muc_open'/>
-           *  <feature var='muc_unmoderated'/>
-           *  <feature var='muc_nonanonymous'/>
-           *  <feature var='urn:xmpp:mam:0'/>
-           */
-          const features = {
+        refreshRoomFeatures() {
+          const entity = _converse.disco_entities.get(this.get('jid'));
+
+          if (entity) {
+            entity.destroy();
+          }
+
+          return this.getRoomFeatures();
+        },
+
+        async getRoomFeatures() {
+          const features = await _converse.api.disco.getFeatures(this.get('jid')),
+                fields = await _converse.api.disco.getFields(this.get('jid')),
+                identity = await _converse.api.disco.getIdentity('conference', 'text', this.get('jid')),
+                attrs = {
             'features_fetched': moment().format(),
-            'name': iq.querySelector('identity').getAttribute('name')
+            'name': identity && identity.get('name')
           };
-
-          _.each(iq.querySelectorAll('feature'), function (field) {
-            const fieldname = field.getAttribute('var');
+          features.each(feature => {
+            const fieldname = feature.get('var');
 
             if (!fieldname.startsWith('muc_')) {
               if (fieldname === Strophe.NS.MAM) {
-                features.mam_enabled = true;
+                attrs.mam_enabled = true;
               }
 
               return;
             }
 
-            features[fieldname.replace('muc_', '')] = true;
+            attrs[fieldname.replace('muc_', '')] = true;
           });
-
-          const desc_field = iq.querySelector('field[var="muc#roominfo_description"] value');
-
-          if (!_.isNull(desc_field)) {
-            features.description = desc_field.textContent;
-          }
-
-          this.save(features);
+          attrs.description = _.get(fields.findWhere({
+            'var': "muc#roominfo_description"
+          }), 'attributes.value');
+          this.save(attrs);
         },
 
         requestMemberList(affiliation) {
@@ -70528,7 +70578,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
            * XXX: Prosody doesn't accept multiple JIDs' affiliations
            * being set in one IQ stanza, so as a workaround we send
            * a separate stanza for each JID.
-           * Related ticket: https://prosody.im/issues/issue/795
+           * Related ticket: https://issues.prosody.im/345
            *
            * Parameters:
            *  (String) affiliation: The affiliation
@@ -70710,6 +70760,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
               xmlns: Strophe.NS.MUC_ADMIN
             }).c("item", {
               'affiliation': member.affiliation || affiliation,
+              'nick': member.nick,
               'jid': member.jid
             });
 
@@ -70816,28 +70867,39 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
         },
 
         async registerNickname() {
+          // See https://xmpp.org/extensions/xep-0045.html#register
+          const nick = this.get('nick'),
+                jid = this.get('jid');
+          let iq;
+
           try {
-            await _converse.api.sendIQ($iq({
-              'from': _converse.bare_jid,
-              'to': this.get('jid'),
+            iq = await _converse.api.sendIQ($iq({
+              '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 ${jid} due to the required fields`);
+          }
+
           try {
             await _converse.api.sendIQ($iq({
-              'from': _converse.bare_jid,
-              'to': this.get('jid'),
+              'to': jid,
+              'from': _converse.connection.jid,
               'type': 'set'
             }).c('query', {
               'xmlns': Strophe.NS.MUC_REGISTER
@@ -70848,14 +70910,14 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
               '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('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);
@@ -70975,7 +71037,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
                 room_now_fully_anon = stanza.querySelector("status[code='173']");
 
           if (configuration_changed || logging_enabled || logging_disabled || room_no_longer_anon || room_now_semi_anon || room_now_fully_anon) {
-            this.getRoomFeatures();
+            this.refreshRoomFeatures();
           }
         },
 
@@ -71075,10 +71137,10 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
 
           if (locked_room) {
             if (this.get('auto_configure')) {
-              this.autoConfigureChatRoom().then(this.getRoomFeatures.bind(this));
+              this.autoConfigureChatRoom().then(() => this.refreshRoomFeatures());
             } else if (_converse.muc_instant_rooms) {
               // Accept default configuration
-              this.saveConfiguration().then(this.getRoomFeatures.bind(this));
+              this.saveConfiguration().then(() => this.getRoomFeatures());
             } else {
               this.trigger('configurationNeeded');
               return; // We haven't yet entered the groupchat, so bail here.
@@ -71090,7 +71152,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
             // otherwise the features would have been fetched in
             // the "initialize" method already.
             if (this.get('affiliation') === 'owner' && this.get('auto_configure')) {
-              this.autoConfigureChatRoom().then(this.getRoomFeatures.bind(this));
+              this.autoConfigureChatRoom().then(() => this.refreshRoomFeatures());
             } else {
               this.getRoomFeatures();
             }
@@ -73556,7 +73618,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
             __ = _converse.__;
 
       _converse.api.settings.update({
-        'push_app_servers': []
+        'push_app_servers': [],
+        'enable_muc_push': false
       });
 
       async function disablePushAppServer(domain, push_app_server) {
@@ -73672,15 +73735,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
         _converse.session.save('push_enabled', push_enabled);
       }
 
+      _converse.api.listen.on('statusInitialized', () => enablePush());
+
       function onChatBoxAdded(model) {
         if (model.get('type') == _converse.CHATROOMS_TYPE) {
           enablePush(Strophe.getDomainFromJid(model.get('jid')));
         }
       }
 
-      _converse.api.listen.on('statusInitialized', () => enablePush());
-
-      _converse.api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded));
+      if (_converse.enable_muc_push) {
+        _converse.api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded));
+      }
     }
 
   });
@@ -78564,8 +78629,6 @@ __e(o.info_configure) +
  } ;
 __p += '\n    <a class="chatbox-btn show-room-details-modal fa fa-info-circle" title="' +
 __e(o.info_details) +
-'"></a>\n    <a class="chatbox-btn show-room-registration-modal fa fa-file-signature" title="' +
-__e(o.info_register) +
 '"></a>\n</div>\n';
 return __p
 };