瀏覽代碼

Release 3.3.3

JC Brand 7 年之前
父節點
當前提交
db85cb7f1d
共有 49 個文件被更改,包括 7625 次插入5803 次删除
  1. 14 5
      CHANGES.md
  2. 1 1
      COPYRIGHT
  3. 1 1
      Makefile
  4. 1 0
      README.md
  5. 177 189
      dist/converse-muc-embedded.js
  6. 427 150
      dist/converse-no-dependencies.js
  7. 1496 459
      dist/converse.js
  8. 2 2
      docs/source/conf.py
  9. 2 2
      docs/source/quickstart.rst
  10. 0 0
      locale/af/LC_MESSAGES/converse.json
  11. 271 243
      locale/af/LC_MESSAGES/converse.po
  12. 0 0
      locale/ca/LC_MESSAGES/converse.json
  13. 270 243
      locale/ca/LC_MESSAGES/converse.po
  14. 313 290
      locale/converse.pot
  15. 0 0
      locale/de/LC_MESSAGES/converse.json
  16. 272 245
      locale/de/LC_MESSAGES/converse.po
  17. 0 0
      locale/es/LC_MESSAGES/converse.json
  18. 317 290
      locale/es/LC_MESSAGES/converse.po
  19. 0 0
      locale/fr/LC_MESSAGES/converse.json
  20. 272 245
      locale/fr/LC_MESSAGES/converse.po
  21. 0 0
      locale/he/LC_MESSAGES/converse.json
  22. 317 290
      locale/he/LC_MESSAGES/converse.po
  23. 0 0
      locale/hu/LC_MESSAGES/converse.json
  24. 316 289
      locale/hu/LC_MESSAGES/converse.po
  25. 0 0
      locale/id/LC_MESSAGES/converse.json
  26. 319 292
      locale/id/LC_MESSAGES/converse.po
  27. 0 0
      locale/it/LC_MESSAGES/converse.json
  28. 295 268
      locale/it/LC_MESSAGES/converse.po
  29. 0 0
      locale/ja/LC_MESSAGES/converse.json
  30. 270 243
      locale/ja/LC_MESSAGES/converse.po
  31. 0 0
      locale/nb/LC_MESSAGES/converse.json
  32. 270 243
      locale/nb/LC_MESSAGES/converse.po
  33. 0 0
      locale/nl/LC_MESSAGES/converse.json
  34. 270 243
      locale/nl/LC_MESSAGES/converse.po
  35. 0 0
      locale/pl/LC_MESSAGES/converse.json
  36. 270 243
      locale/pl/LC_MESSAGES/converse.po
  37. 0 0
      locale/pt_BR/LC_MESSAGES/converse.json
  38. 274 247
      locale/pt_BR/LC_MESSAGES/converse.po
  39. 0 0
      locale/ru/LC_MESSAGES/converse.json
  40. 274 247
      locale/ru/LC_MESSAGES/converse.po
  41. 0 0
      locale/uk/LC_MESSAGES/converse.json
  42. 274 247
      locale/uk/LC_MESSAGES/converse.po
  43. 0 0
      locale/zh_CN/LC_MESSAGES/converse.json
  44. 317 290
      locale/zh_CN/LC_MESSAGES/converse.po
  45. 0 0
      locale/zh_TW/LC_MESSAGES/converse.json
  46. 320 293
      locale/zh_TW/LC_MESSAGES/converse.po
  47. 1 1
      package-lock.json
  48. 1 1
      package.json
  49. 1 1
      src/start.frag

+ 14 - 5
CHANGES.md

@@ -1,16 +1,24 @@
 # Changelog
 # Changelog
 
 
-## 3.3.3 (Unreleased)
+## 3.3.3 (2018-02-14)
 
 
 ### Bugfixes
 ### Bugfixes
 - Attribute error when empty IQ stanza is returned for vCard query
 - Attribute error when empty IQ stanza is returned for vCard query
-- Don't allow PEP bookmarks if `pubsub#publish-options` is not advertised by the server.
 - In fullscreen view, sometimes a background MUC would come into the foreground
 - In fullscreen view, sometimes a background MUC would come into the foreground
   when a new message appears inside it.
   when a new message appears inside it.
 
 
-_Note: previously this meant that bookmarks sent to servers that don't
-support `pubsub#publish-options` were visible to all your contacts, even
-though they should be private._
+### Security fixes
+
+- CVE-2018-6591: Don't allow PEP bookmarks if `pubsub#publish-options` is not advertised by the server.
+
+    In previous versions of converse.js, bookmarks sent to servers that don't
+    support `pubsub#publish-options` were visible to all your contacts, even
+    though they should be kept private. This is due to those servers simply
+    ignoring the `pubsub#publish-options` directive and converse.js not checking
+    first whether `pubsub#publish-options` is supported before setting bookmarks
+    via PEP.
+
+    More info here: https://gultsch.de/converse_bookmarks.html
 
 
 ### New features
 ### New features
 - XEP-0382 Spoiler Messages (currently only for private chats)
 - XEP-0382 Spoiler Messages (currently only for private chats)
@@ -19,6 +27,7 @@ though they should be private._
     - No need to manually blacklist or whitelist any plugins.
     - No need to manually blacklist or whitelist any plugins.
     - Relies on the [view_mode](https://conversejs.org/docs/html/configurations.html#view-mode) being set to `'embedded'`.
     - Relies on the [view_mode](https://conversejs.org/docs/html/configurations.html#view-mode) being set to `'embedded'`.
     - The main `converse.js` build can be used for the embedded usecase.
     - The main `converse.js` build can be used for the embedded usecase.
+    - Maintain MUC session upon page reload
 
 
 ### API changes
 ### API changes
 - New API method `_converse.disco.getIdentity` to check whether a JID has a given identity.
 - New API method `_converse.disco.getIdentity` to check whether a JID has a given identity.

+ 1 - 1
COPYRIGHT

@@ -2,7 +2,7 @@
  *
  *
  *  An XMPP chat client that runs in the browser.
  *  An XMPP chat client that runs in the browser.
  *
  *
- *  Version: 3.3.2
+ *  Version: 3.3.3
  *
  *
  *  Copyright: JC Brand 2012-2017
  *  Copyright: JC Brand 2012-2017
  *  Except for 3rd party dependencies.
  *  Except for 3rd party dependencies.

+ 1 - 1
Makefile

@@ -71,7 +71,7 @@ serve_bg: dev
 ########################################################################
 ########################################################################
 ## Translation machinery
 ## Translation machinery
 
 
-GETTEXT = xgettext --language="JavaScript" --keyword=__ --keyword=___ --from-code=UTF-8 --output=locale/converse.pot dist/converse-no-dependencies.js --package-name=Converse.js --copyright-holder="Jan-Carel Brand" --package-version=3.3.2 -c
+GETTEXT = xgettext --language="JavaScript" --keyword=__ --keyword=___ --from-code=UTF-8 --output=locale/converse.pot dist/converse-no-dependencies.js --package-name=Converse.js --copyright-holder="Jan-Carel Brand" --package-version=3.3.3 -c
 
 
 .PHONY: pot
 .PHONY: pot
 pot: dist/converse-no-dependencies.js
 pot: dist/converse-no-dependencies.js

+ 1 - 0
README.md

@@ -116,6 +116,7 @@ The following people are making recurring donations:
 * [Rafael](https://www.patreon.com/user/creators?u=4340078)
 * [Rafael](https://www.patreon.com/user/creators?u=4340078)
 * [mt7479](https://www.patreon.com/user/creators?u=3892290)
 * [mt7479](https://www.patreon.com/user/creators?u=3892290)
 * [roelra](https://www.patreon.com/user/creators?u=5958918)
 * [roelra](https://www.patreon.com/user/creators?u=5958918)
+* [Guus der Kinderen](https://www.patreon.com/user/creators?u=8302585)
 * An anonymous backer on Liberapay
 * An anonymous backer on Liberapay
 
 
 Additionally this project is supported by
 Additionally this project is supported by

+ 177 - 189
dist/converse-muc-embedded.js

@@ -2,7 +2,7 @@
  *
  *
  *  An XMPP chat client that runs in the browser.
  *  An XMPP chat client that runs in the browser.
  *
  *
- *  Version: 3.3.2
+ *  Version: 3.3.3
  */
  */
 
 
 /* jshint ignore:start */
 /* jshint ignore:start */
@@ -41366,6 +41366,168 @@ return Backbone.BrowserStorage;
   return window.converse;
   return window.converse;
 });
 });
 //# sourceMappingURL=converse-core.js.map;
 //# sourceMappingURL=converse-core.js.map;
+/*!
+ * Backbone.Overview 
+ *
+ * Copyright (c) 2018, JC Brand <jc@opkode.com>
+ * Licensed under the Mozilla Public License (MPL) 
+ */
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    define('backbone.overview',["underscore", "backbone"], factory);
+  } else {
+    // RequireJS isn't being used.
+    // Assume underscore and backbone are loaded in <script> tags
+    factory(_ || root._, Backbone || root.Backbone);
+  }
+})(this, function (_, Backbone) {
+  "use strict";
+
+  var View = _.isUndefined(Backbone.NativeView) ? Backbone.View : Backbone.NativeView;
+
+  var Overview = Backbone.Overview = function (options) {
+    /* An Overview is a View that contains and keeps track of sub-views.
+     * Kind of like what a Collection is to a Model.
+     */
+    var that = this;
+    this.views = {};
+    this.keys = _.partial(_.keys, this.views);
+    this.getAll = _.partial(_.identity, this.views);
+
+    this.get = function (id) {
+      return that.views[id];
+    };
+
+    this.xget = function (id) {
+      /* Exclusive get. Returns all instances except the given id. */
+      return _.filter(that.views, function (view, vid) {
+        return vid !== id;
+      });
+    };
+
+    this.add = function (id, view) {
+      that.views[id] = view;
+      return view;
+    };
+
+    this.remove = function (id) {
+      if (typeof id === "undefined") {
+        new View().remove.apply(that);
+      }
+
+      var view = that.views[id];
+
+      if (view) {
+        delete that.views[id];
+        view.remove();
+        return view;
+      }
+    };
+
+    this.removeAll = function () {
+      _.each(_.keys(that.views), that.remove);
+
+      return that;
+    };
+
+    View.apply(this, Array.prototype.slice.apply(arguments));
+  };
+
+  var methods = ['all', 'any', 'chain', 'collect', 'contains', 'detect', 'difference', 'drop', 'each', 'every', 'filter', 'find', 'first', 'foldl', 'foldr', 'forEach', 'head', 'include', 'indexOf', 'initial', 'inject', 'invoke', 'isEmpty', 'last', 'lastIndexOf', 'map', 'max', 'min', 'reduce', 'reduceRight', 'reject', 'rest', 'sample', 'select', 'shuffle', 'size', 'some', 'sortBy', 'tail', 'take', 'toArray', 'without']; // Mix in each Underscore method as a proxy to `Overview#view`.
+
+  _.each(methods, function (method) {
+    Overview.prototype[method] = function () {
+      var args = Array.prototype.slice.call(arguments);
+      args.unshift(this.views);
+      return _[method].apply(_, args);
+    };
+  });
+
+  _.extend(Overview.prototype, View.prototype);
+
+  Overview.extend = View.extend;
+  Backbone.OrderedListView = Backbone.Overview.extend({
+    // The `listItems` attribute denotes the path (from this View) to the
+    // list of items.
+    listItems: 'model',
+    // The `sortEvent` attribute specifies the event which should cause the
+    // ordered list to be sorted.
+    sortEvent: 'change',
+    // The `listSelector` is the selector used to query for the DOM list
+    // element which contains the ordered items.
+    listSelector: '.ordered-items',
+    // The `itemView` is constructor which should be called to create a
+    // View for a new item.
+    ItemView: undefined,
+    initialize: function initialize() {
+      this.sortEventually = _.debounce(this.sortAndPositionAllItems.bind(this), 500);
+      this.items = _.get(this, this.listItems);
+      this.items.on('add', this.createItemView, this);
+      this.items.on('add', this.sortEventually, this);
+      this.items.on(this.sortEvent, this.sortEventually, this);
+    },
+    createItemView: function createItemView(item) {
+      var item_view = this.get(item.get('id'));
+
+      if (!item_view) {
+        item_view = new this.ItemView({
+          model: item
+        });
+        this.add(item.get('id'), item_view);
+      } else {
+        item_view.model = item;
+        item_view.initialize();
+      }
+
+      item_view.render();
+      return item_view;
+    },
+    sortAndPositionAllItems: function sortAndPositionAllItems() {
+      var _this = this;
+
+      this.items.sort();
+      this.items.each(function (item) {
+        if (_.isUndefined(_this.get(item.get('id')))) {
+          _this.createItemView(item);
+        }
+
+        _this.positionItem(item, _this.el.querySelector(_this.listSelector));
+      });
+    },
+    positionItem: function positionItem(item, list_el) {
+      /* Place the View's DOM element in the correct alphabetical
+       * position in the list.
+       *
+       * IMPORTANT: there's an important implicit assumption being
+       * made here. And that is that initially this method gets called
+       * for each item in the right positional order.
+       *
+       * In other words, it gets called for the 0th, then the
+       * 1st, then the 2nd, 3rd and so on.
+       *
+       * That's why we call it in the "success" handler after
+       * fetching the items, so that we know we have ALL of
+       * them and that they're sorted.
+       */
+      var view = this.get(item.get('id')),
+          index = this.items.indexOf(item);
+
+      if (index === 0) {
+        list_el.insertAdjacentElement('afterbegin', view.el);
+      } else if (index === this.items.length - 1) {
+        list_el.insertAdjacentElement('beforeend', view.el);
+      } else {
+        var neighbour_el = list_el.querySelector('li:nth-child(' + index + ')');
+        neighbour_el.insertAdjacentElement('afterend', view.el);
+      }
+
+      return view;
+    }
+  });
+  return Backbone.Overview;
+});
+
+//# sourceMappingURL=backbone.overview.js.map;
 // Converse.js (A browser based XMPP chat client)
 // Converse.js (A browser based XMPP chat client)
 // http://conversejs.org
 // http://conversejs.org
 //
 //
@@ -41375,7 +41537,7 @@ return Backbone.BrowserStorage;
 
 
 /*global define */
 /*global define */
 (function (root, factory) {
 (function (root, factory) {
-  define('converse-chatboxes',["converse-core"], factory);
+  define('converse-chatboxes',["converse-core", "backbone.overview"], factory);
 })(this, function (converse) {
 })(this, function (converse) {
   "use strict";
   "use strict";
 
 
@@ -41549,8 +41711,8 @@ return Backbone.BrowserStorage;
         },
         },
         incrementUnreadMsgCounter: function incrementUnreadMsgCounter(stanza) {
         incrementUnreadMsgCounter: function incrementUnreadMsgCounter(stanza) {
           /* Given a newly received message, update the unread counter if
           /* Given a newly received message, update the unread counter if
-          * necessary.
-          */
+           * necessary.
+           */
           if (_.isNull(stanza.querySelector('body'))) {
           if (_.isNull(stanza.querySelector('body'))) {
             return; // The message has no text
             return; // The message has no text
           }
           }
@@ -44739,7 +44901,7 @@ return __p
           }
           }
         },
         },
         setScrollPosition: function setScrollPosition(ev) {
         setScrollPosition: function setScrollPosition(ev) {
-          this.model.save('scroll_position', ev.target.scrollTop);
+          this.model.save('scroll_position', this.content);
         },
         },
         chooseSkinTone: function chooseSkinTone(ev) {
         chooseSkinTone: function chooseSkinTone(ev) {
           ev.preventDefault();
           ev.preventDefault();
@@ -45664,6 +45826,7 @@ return __p
         },
         },
         afterShown: function afterShown(focus) {
         afterShown: function afterShown(focus) {
           if (u.isPersistableModel(this.model)) {
           if (u.isPersistableModel(this.model)) {
+            this.model.clearUnreadMsgCounter();
             this.model.save();
             this.model.save();
           }
           }
 
 
@@ -46742,7 +46905,7 @@ Strophe.RSM.prototype = {
         onScroll: function onScroll(ev) {
         onScroll: function onScroll(ev) {
           var _converse = this.__super__._converse;
           var _converse = this.__super__._converse;
 
 
-          if (ev.target.scrollTop === 0 && this.model.messages.length) {
+          if (this.content.scrollTop === 0 && this.model.messages.length) {
             var oldest_message = this.model.messages.at(0);
             var oldest_message = this.model.messages.at(0);
             var archive_id = oldest_message.get('archive_id');
             var archive_id = oldest_message.get('archive_id');
 
 
@@ -48343,168 +48506,6 @@ define("awesomplete", (function (global) {
     };
     };
 }(this)));
 }(this)));
 
 
-/*!
- * Backbone.Overview 
- *
- * Copyright (c) 2018, JC Brand <jc@opkode.com>
- * Licensed under the Mozilla Public License (MPL) 
- */
-(function (root, factory) {
-  if (typeof define === 'function' && define.amd) {
-    define('backbone.overview',["underscore", "backbone"], factory);
-  } else {
-    // RequireJS isn't being used.
-    // Assume underscore and backbone are loaded in <script> tags
-    factory(_ || root._, Backbone || root.Backbone);
-  }
-})(this, function (_, Backbone) {
-  "use strict";
-
-  var View = _.isUndefined(Backbone.NativeView) ? Backbone.View : Backbone.NativeView;
-
-  var Overview = Backbone.Overview = function (options) {
-    /* An Overview is a View that contains and keeps track of sub-views.
-     * Kind of like what a Collection is to a Model.
-     */
-    var that = this;
-    this.views = {};
-    this.keys = _.partial(_.keys, this.views);
-    this.getAll = _.partial(_.identity, this.views);
-
-    this.get = function (id) {
-      return that.views[id];
-    };
-
-    this.xget = function (id) {
-      /* Exclusive get. Returns all instances except the given id. */
-      return _.filter(that.views, function (view, vid) {
-        return vid !== id;
-      });
-    };
-
-    this.add = function (id, view) {
-      that.views[id] = view;
-      return view;
-    };
-
-    this.remove = function (id) {
-      if (typeof id === "undefined") {
-        new View().remove.apply(that);
-      }
-
-      var view = that.views[id];
-
-      if (view) {
-        delete that.views[id];
-        view.remove();
-        return view;
-      }
-    };
-
-    this.removeAll = function () {
-      _.each(_.keys(that.views), that.remove);
-
-      return that;
-    };
-
-    View.apply(this, Array.prototype.slice.apply(arguments));
-  };
-
-  var methods = ['all', 'any', 'chain', 'collect', 'contains', 'detect', 'difference', 'drop', 'each', 'every', 'filter', 'find', 'first', 'foldl', 'foldr', 'forEach', 'head', 'include', 'indexOf', 'initial', 'inject', 'invoke', 'isEmpty', 'last', 'lastIndexOf', 'map', 'max', 'min', 'reduce', 'reduceRight', 'reject', 'rest', 'sample', 'select', 'shuffle', 'size', 'some', 'sortBy', 'tail', 'take', 'toArray', 'without']; // Mix in each Underscore method as a proxy to `Overview#view`.
-
-  _.each(methods, function (method) {
-    Overview.prototype[method] = function () {
-      var args = Array.prototype.slice.call(arguments);
-      args.unshift(this.views);
-      return _[method].apply(_, args);
-    };
-  });
-
-  _.extend(Overview.prototype, View.prototype);
-
-  Overview.extend = View.extend;
-  Backbone.OrderedListView = Backbone.Overview.extend({
-    // The `listItems` attribute denotes the path (from this View) to the
-    // list of items.
-    listItems: 'model',
-    // The `sortEvent` attribute specifies the event which should cause the
-    // ordered list to be sorted.
-    sortEvent: 'change',
-    // The `listSelector` is the selector used to query for the DOM list
-    // element which contains the ordered items.
-    listSelector: '.ordered-items',
-    // The `itemView` is constructor which should be called to create a
-    // View for a new item.
-    ItemView: undefined,
-    initialize: function initialize() {
-      this.sortEventually = _.debounce(this.sortAndPositionAllItems.bind(this), 500);
-      this.items = _.get(this, this.listItems);
-      this.items.on('add', this.createItemView, this);
-      this.items.on('add', this.sortEventually, this);
-      this.items.on(this.sortEvent, this.sortEventually, this);
-    },
-    createItemView: function createItemView(item) {
-      var item_view = this.get(item.get('id'));
-
-      if (!item_view) {
-        item_view = new this.ItemView({
-          model: item
-        });
-        this.add(item.get('id'), item_view);
-      } else {
-        item_view.model = item;
-        item_view.initialize();
-      }
-
-      item_view.render();
-      return item_view;
-    },
-    sortAndPositionAllItems: function sortAndPositionAllItems() {
-      var _this = this;
-
-      this.items.sort();
-      this.items.each(function (item) {
-        if (_.isUndefined(_this.get(item.get('id')))) {
-          _this.createItemView(item);
-        }
-
-        _this.positionItem(item, _this.el.querySelector(_this.listSelector));
-      });
-    },
-    positionItem: function positionItem(item, list_el) {
-      /* Place the View's DOM element in the correct alphabetical
-       * position in the list.
-       *
-       * IMPORTANT: there's an important implicit assumption being
-       * made here. And that is that initially this method gets called
-       * for each item in the right positional order.
-       *
-       * In other words, it gets called for the 0th, then the
-       * 1st, then the 2nd, 3rd and so on.
-       *
-       * That's why we call it in the "success" handler after
-       * fetching the items, so that we know we have ALL of
-       * them and that they're sorted.
-       */
-      var view = this.get(item.get('id')),
-          index = this.items.indexOf(item);
-
-      if (index === 0) {
-        list_el.insertAdjacentElement('afterbegin', view.el);
-      } else if (index === this.items.length - 1) {
-        list_el.insertAdjacentElement('beforeend', view.el);
-      } else {
-        var neighbour_el = list_el.querySelector('li:nth-child(' + index + ')');
-        neighbour_el.insertAdjacentElement('afterend', view.el);
-      }
-
-      return view;
-    }
-  });
-  return Backbone.Overview;
-});
-
-//# sourceMappingURL=backbone.overview.js.map;
 /*!
 /*!
  * Backbone.OrderedListView
  * Backbone.OrderedListView
  *
  *
@@ -50086,9 +50087,8 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
            *
            *
            * This is instead done in `afterConnected` below.
            * This is instead done in `afterConnected` below.
            */
            */
-          if (this.model.collection && this.model.collection.browserStorage) {
-            // Without a connection, we haven't yet initialized
-            // localstorage
+          if (u.isPersistableModel(this.model)) {
+            this.model.clearUnreadMsgCounter();
             this.model.save();
             this.model.save();
           }
           }
 
 
@@ -52545,6 +52545,12 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
          * settings).
          * settings).
          */
          */
         _.each(_converse.auto_join_rooms, function (room) {
         _.each(_converse.auto_join_rooms, function (room) {
+          if (_converse.chatboxes.where({
+            'jid': room
+          }).length) {
+            return;
+          }
+
           if (_.isString(room)) {
           if (_.isString(room)) {
             _converse.api.rooms.open(room);
             _converse.api.rooms.open(room);
           } else if (_.isObject(room)) {
           } else if (_.isObject(room)) {
@@ -52786,24 +52792,6 @@ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterat
       // relevant objects or classes.
       // relevant objects or classes.
       //
       //
       // New functions which don't exist yet can also be added.
       // New functions which don't exist yet can also be added.
-      ChatBoxes: {
-        onConnected: function onConnected() {
-          // Override to avoid storing or fetching chat boxes from session
-          // storage.
-          var _converse = this.__super__._converse;
-          this.browserStorage = new Backbone.BrowserStorage[_converse.storage](converse.env.b64_sha1("converse.chatboxes-".concat(_converse.bare_jid)));
-          this.registerMessageHandler();
-          /* This is disabled:
-           *
-           * this.fetch({
-           *      add: true,
-           *      success: this.onChatBoxesFetched.bind(this)
-           *  });
-           */
-
-          this.onChatBoxesFetched(new Backbone.Collection());
-        }
-      },
       ChatBoxViews: {
       ChatBoxViews: {
         initialize: function initialize() {
         initialize: function initialize() {
           this.__super__.initialize.apply(this, arguments);
           this.__super__.initialize.apply(this, arguments);

文件差異過大導致無法顯示
+ 427 - 150
dist/converse-no-dependencies.js


文件差異過大導致無法顯示
+ 1496 - 459
dist/converse.js


+ 2 - 2
docs/source/conf.py

@@ -48,9 +48,9 @@ copyright = u'2017, JC Brand'
 # built documents.
 # built documents.
 #
 #
 # The short X.Y version.
 # The short X.Y version.
-version = '3.3.2'
+version = '3.3.3'
 # The full version, including alpha/beta/rc tags.
 # The full version, including alpha/beta/rc tags.
-release = '3.3.2'
+release = '3.3.3'
 
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
 # for a list of supported languages.

+ 2 - 2
docs/source/quickstart.rst

@@ -22,8 +22,8 @@ The latest versions of these files are available at these URLs:
 
 
 To load a specific version of Converse.js you can put the version in the URL, like so:
 To load a specific version of Converse.js you can put the version in the URL, like so:
 
 
-* https://cdn.conversejs.org/3.3.2/dist/converse.min.js
-* https://cdn.conversejs.org/3.3.2/css/converse.min.css
+* https://cdn.conversejs.org/3.3.3/dist/converse.min.js
+* https://cdn.conversejs.org/3.3.3/css/converse.min.css
 
 
 You can include these two URLs inside the *<head>* element of your website
 You can include these two URLs inside the *<head>* element of your website
 via the *script* and *link* tags:
 via the *script* and *link* tags:

文件差異過大導致無法顯示
+ 0 - 0
locale/af/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 271 - 243
locale/af/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/ca/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 270 - 243
locale/ca/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 313 - 290
locale/converse.pot


文件差異過大導致無法顯示
+ 0 - 0
locale/de/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 272 - 245
locale/de/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/es/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 317 - 290
locale/es/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/fr/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 272 - 245
locale/fr/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/he/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 317 - 290
locale/he/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/hu/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 316 - 289
locale/hu/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/id/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 319 - 292
locale/id/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/it/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 295 - 268
locale/it/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/ja/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 270 - 243
locale/ja/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/nb/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 270 - 243
locale/nb/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/nl/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 270 - 243
locale/nl/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/pl/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 270 - 243
locale/pl/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/pt_BR/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 274 - 247
locale/pt_BR/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/ru/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 274 - 247
locale/ru/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/uk/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 274 - 247
locale/uk/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/zh_CN/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 317 - 290
locale/zh_CN/LC_MESSAGES/converse.po


文件差異過大導致無法顯示
+ 0 - 0
locale/zh_TW/LC_MESSAGES/converse.json


文件差異過大導致無法顯示
+ 320 - 293
locale/zh_TW/LC_MESSAGES/converse.po


+ 1 - 1
package-lock.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "converse.js",
   "name": "converse.js",
-  "version": "3.3.2",
+  "version": "3.3.3",
   "lockfileVersion": 1,
   "lockfileVersion": 1,
   "requires": true,
   "requires": true,
   "dependencies": {
   "dependencies": {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "converse.js",
   "name": "converse.js",
-  "version": "3.3.2",
+  "version": "3.3.3",
   "description": "Browser based XMPP instant messaging client",
   "description": "Browser based XMPP instant messaging client",
   "main": "main.js",
   "main": "main.js",
   "directories": {
   "directories": {

+ 1 - 1
src/start.frag

@@ -2,7 +2,7 @@
  *
  *
  *  An XMPP chat client that runs in the browser.
  *  An XMPP chat client that runs in the browser.
  *
  *
- *  Version: 3.3.2
+ *  Version: 3.3.3
  */
  */
 
 
 /* jshint ignore:start */
 /* jshint ignore:start */

部分文件因文件數量過多而無法顯示