Fixes #1317 Don't show errors for CSI messages
This commit is contained in:
parent
1e7247b4d2
commit
7cb889b065
@ -15,6 +15,7 @@
|
|||||||
- #1306 added option `notification_delay`
|
- #1306 added option `notification_delay`
|
||||||
- #1312 Error `unrecognized expression` in Safari
|
- #1312 Error `unrecognized expression` in Safari
|
||||||
- #1316 show version info in login dialog
|
- #1316 show version info in login dialog
|
||||||
|
- #1317 Don't show errors for CSI messages
|
||||||
- #1318 added values 'on' and 'off' for 'trusted' option which removes the "This is a trusted device" checkbox from the login form
|
- #1318 added values 'on' and 'off' for 'trusted' option which removes the "This is a trusted device" checkbox from the login form
|
||||||
- #1319 Implement sending of presences according to XEP-0319: Last User Interaction in Presence
|
- #1319 Implement sending of presences according to XEP-0319: Last User Interaction in Presence
|
||||||
|
|
||||||
|
22
dist/converse.js
vendored
22
dist/converse.js
vendored
@ -71131,6 +71131,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
|
|||||||
*/
|
*/
|
||||||
if (_converse.send_chat_state_notifications && this.get('chat_state')) {
|
if (_converse.send_chat_state_notifications && this.get('chat_state')) {
|
||||||
_converse.api.send($msg({
|
_converse.api.send($msg({
|
||||||
|
'id': _converse.connection.getUniqueId(),
|
||||||
'to': this.get('jid'),
|
'to': this.get('jid'),
|
||||||
'type': 'chat'
|
'type': 'chat'
|
||||||
}).c(this.get('chat_state'), {
|
}).c(this.get('chat_state'), {
|
||||||
@ -71395,6 +71396,27 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-cha
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const id = message.getAttribute('id');
|
||||||
|
|
||||||
|
if (id) {
|
||||||
|
const msg = chatbox.messages.findWhere({
|
||||||
|
'msgid': id
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!msg) {
|
||||||
|
// This error refers to a message not included in our store.
|
||||||
|
// We assume that this was a CSI message (which we don't store).
|
||||||
|
// See https://github.com/conversejs/converse.js/issues/1317
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// An error message without id likely means that we
|
||||||
|
// sent a message without id (which shouldn't happen).
|
||||||
|
_converse.log('Received an error message without id attribute!', Strophe.LogLevel.ERROR);
|
||||||
|
|
||||||
|
_converse.log(message, Strophe.LogLevel.ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
chatbox.createMessage(message, message);
|
chatbox.createMessage(message, message);
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
@ -1620,6 +1620,44 @@
|
|||||||
expect(chat_content.querySelectorAll('.chat-error').length).toEqual(3);
|
expect(chat_content.querySelectorAll('.chat-error').length).toEqual(3);
|
||||||
done();
|
done();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
it("will not show to the user an error message for a CSI message",
|
||||||
|
mock.initConverseWithPromises(
|
||||||
|
null, ['rosterGroupsFetched', 'chatBoxesFetched'], {},
|
||||||
|
async function (done, _converse) {
|
||||||
|
|
||||||
|
// See #1317
|
||||||
|
// https://github.com/conversejs/converse.js/issues/1317
|
||||||
|
test_utils.createContacts(_converse, 'current');
|
||||||
|
_converse.emit('rosterContactsFetched');
|
||||||
|
test_utils.openControlBox();
|
||||||
|
|
||||||
|
const contact_jid = mock.cur_names[5].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||||
|
await test_utils.openChatBoxFor(_converse, contact_jid);
|
||||||
|
|
||||||
|
const messages = _converse.connection.sent_stanzas.filter(s => s.nodeName === 'message');
|
||||||
|
expect(messages.length).toBe(1);
|
||||||
|
expect(Strophe.serialize(messages[0])).toBe(
|
||||||
|
`<message id="${messages[0].getAttribute('id')}" to="robin.schook@localhost" type="chat" xmlns="jabber:client">`+
|
||||||
|
`<active xmlns="http://jabber.org/protocol/chatstates"/>`+
|
||||||
|
`<no-store xmlns="urn:xmpp:hints"/>`+
|
||||||
|
`<no-permanent-store xmlns="urn:xmpp:hints"/>`+
|
||||||
|
`</message>`);
|
||||||
|
|
||||||
|
const stanza = $msg({
|
||||||
|
'from': contact_jid,
|
||||||
|
'type': 'error',
|
||||||
|
'id': messages[0].getAttribute('id')
|
||||||
|
}).c('error', {'type': 'cancel', 'code': '503'})
|
||||||
|
.c('service-unavailable', { 'xmlns': 'urn:ietf:params:xml:ns:xmpp-stanzas' }).up()
|
||||||
|
.c('text', { 'xmlns': 'urn:ietf:params:xml:ns:xmpp-stanzas' })
|
||||||
|
.t('User session not found')
|
||||||
|
_converse.connection._dataRecv(test_utils.createRequest(stanza));
|
||||||
|
const view = _converse.chatboxviews.get(contact_jid);
|
||||||
|
const chat_content = view.el.querySelector('.chat-content');
|
||||||
|
expect(chat_content.querySelectorAll('.chat-error').length).toEqual(0);
|
||||||
|
done();
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -168,10 +168,10 @@ converse.plugins.add('converse-message-view', {
|
|||||||
renderErrorMessage () {
|
renderErrorMessage () {
|
||||||
const moment_time = moment(this.model.get('time')),
|
const moment_time = moment(this.model.get('time')),
|
||||||
msg = u.stringToElement(
|
msg = u.stringToElement(
|
||||||
tpl_info(_.extend(this.model.toJSON(), {
|
tpl_info(_.extend(this.model.toJSON(), {
|
||||||
'extra_classes': 'chat-error',
|
'extra_classes': 'chat-error',
|
||||||
'isodate': moment_time.format()
|
'isodate': moment_time.format()
|
||||||
})));
|
})));
|
||||||
return this.replaceElement(msg);
|
return this.replaceElement(msg);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -427,10 +427,13 @@ converse.plugins.add('converse-chatboxes', {
|
|||||||
*/
|
*/
|
||||||
if (_converse.send_chat_state_notifications && this.get('chat_state')) {
|
if (_converse.send_chat_state_notifications && this.get('chat_state')) {
|
||||||
_converse.api.send(
|
_converse.api.send(
|
||||||
$msg({'to':this.get('jid'), 'type': 'chat'})
|
$msg({
|
||||||
.c(this.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES}).up()
|
'id': _converse.connection.getUniqueId(),
|
||||||
.c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
|
'to': this.get('jid'),
|
||||||
.c('no-permanent-store', {'xmlns': Strophe.NS.HINTS})
|
'type': 'chat'
|
||||||
|
}).c(this.get('chat_state'), {'xmlns': Strophe.NS.CHATSTATES}).up()
|
||||||
|
.c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
|
||||||
|
.c('no-permanent-store', {'xmlns': Strophe.NS.HINTS})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -666,6 +669,21 @@ converse.plugins.add('converse-chatboxes', {
|
|||||||
if (!chatbox) {
|
if (!chatbox) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
const id = message.getAttribute('id');
|
||||||
|
if (id) {
|
||||||
|
const msg = chatbox.messages.findWhere({'msgid': id});
|
||||||
|
if (!msg) {
|
||||||
|
// This error refers to a message not included in our store.
|
||||||
|
// We assume that this was a CSI message (which we don't store).
|
||||||
|
// See https://github.com/conversejs/converse.js/issues/1317
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// An error message without id likely means that we
|
||||||
|
// sent a message without id (which shouldn't happen).
|
||||||
|
_converse.log('Received an error message without id attribute!', Strophe.LogLevel.ERROR);
|
||||||
|
_converse.log(message, Strophe.LogLevel.ERROR);
|
||||||
|
}
|
||||||
chatbox.createMessage(message, message);
|
chatbox.createMessage(message, message);
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
@ -111,17 +111,29 @@
|
|||||||
mock.mock_connection = function () { // eslint-disable-line wrap-iife
|
mock.mock_connection = function () { // eslint-disable-line wrap-iife
|
||||||
return function () {
|
return function () {
|
||||||
Strophe.Bosh.prototype._processRequest = function () {}; // Don't attempt to send out stanzas
|
Strophe.Bosh.prototype._processRequest = function () {}; // Don't attempt to send out stanzas
|
||||||
var c = new Strophe.Connection('jasmine tests');
|
const c = new Strophe.Connection('jasmine tests');
|
||||||
var sendIQ = c.sendIQ;
|
const sendIQ = c.sendIQ;
|
||||||
|
|
||||||
c.IQ_stanzas = [];
|
c.IQ_stanzas = [];
|
||||||
c.IQ_ids = [];
|
c.IQ_ids = [];
|
||||||
c.sendIQ = function (iq, callback, errback) {
|
c.sendIQ = function (iq, callback, errback) {
|
||||||
this.IQ_stanzas.push(iq);
|
this.IQ_stanzas.push(iq);
|
||||||
var id = sendIQ.bind(this)(iq, callback, errback);
|
const id = sendIQ.bind(this)(iq, callback, errback);
|
||||||
this.IQ_ids.push(id);
|
this.IQ_ids.push(id);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const send = c.send;
|
||||||
|
c.sent_stanzas = [];
|
||||||
|
c.send = function (stanza) {
|
||||||
|
if (_.isElement(stanza)) {
|
||||||
|
this.sent_stanzas.push(stanza);
|
||||||
|
} else {
|
||||||
|
this.sent_stanzas.push(stanza.nodeTree);
|
||||||
|
}
|
||||||
|
return send.apply(this, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
c.features = Strophe.xmlHtmlNode(
|
c.features = Strophe.xmlHtmlNode(
|
||||||
'<stream:features xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">'+
|
'<stream:features xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">'+
|
||||||
'<ver xmlns="urn:xmpp:features:rosterver"/>'+
|
'<ver xmlns="urn:xmpp:features:rosterver"/>'+
|
||||||
|
Loading…
Reference in New Issue
Block a user