fix unsolicited fetch response detection

fork
mscdex 12 years ago
parent 23dc0e9c80
commit 44fb676910

@ -272,7 +272,7 @@ The structure of a message with only one part will simply look something like th
Therefore, an easy way to check for a multipart message is to check if the structure length is >1. Therefore, an easy way to check for a multipart message is to check if the structure length is >1.
Lastly, here are the system flags defined by the IMAP spec (that may be added/removed to/from messages): Lastly, here are the system flags defined by RFC3501 that may be added/removed:
* Seen - Message has been read * Seen - Message has been read
* Answered - Message has been answered * Answered - Message has been answered

@ -308,69 +308,72 @@ ImapConnection.prototype.connect = function(loginCb) {
// m.info = message details // m.info = message details
var data, parsed, headers, f, lenf, body, lenb, msg, bodies, var data, parsed, headers, f, lenf, body, lenb, msg, bodies,
details, val; details, val;
bodies = parsers.parseFetchBodies(m.info, indata.literals); if (!isUnsolicited)
bodies = parsers.parseFetchBodies(m.info, indata.literals);
details = new ImapMessage(); details = new ImapMessage();
parsers.parseFetch(m.info, indata.literals, details); parsers.parseFetch(m.info, indata.literals, details);
details.seqno = parseInt(m.num, 10); details.seqno = parseInt(m.num, 10);
if (requests[0].fetchers[''] !== undefined) { if (isUnsolicited)
// account for non-body fetches self.emit('msgupdate', details);
if (bodies) { else {
bodies.push(''); if (requests[0].fetchers[''] !== undefined) {
bodies.push(null); // account for non-body fetches
} else if (bodies) {
bodies = ['', null]; bodies.push('');
} bodies.push(null);
} else
bodies = ['', null];
}
for (body = 0, lenb = bodies.length; body < lenb; body += 2) { for (body = 0, lenb = bodies.length; body < lenb; body += 2) {
fetches = requests[0].fetchers[bodies[body]]; fetches = requests[0].fetchers[bodies[body]];
val = bodies[body + 1]; val = bodies[body + 1];
for (var i=0, len=fetches.length; i<len; ++i) { for (var i=0, len=fetches.length; i<len; ++i) {
parsed = undefined; parsed = undefined;
if (!fetches[i]._msg) if (!fetches[i]._msg)
fetches[i]._msg = new ImapMessage(); fetches[i]._msg = new ImapMessage();
// copy message properties (uid, date, flags, etc) // copy message properties (uid, date, flags, etc)
for (var k = 0, keys = Object.keys(details), lenk = keys.length; for (var k = 0, keys = Object.keys(details), lenk = keys.length;
k < lenk; ++k) k < lenk; ++k)
fetches[i]._msg[keys[k]] = details[keys[k]]; fetches[i]._msg[keys[k]] = details[keys[k]];
if (typeof val === 'number') { if (typeof val === 'number') {
// we streamed a body, e.g. {3}\r\nfoo // we streamed a body, e.g. {3}\r\nfoo
} else { } else {
// no body was streamed // no body was streamed
if (isUnsolicited) if (typeof val === 'string') {
self.emit('msgupdate', details); // a body was given as a non-literal string, e.g. "foo"
else if (typeof val === 'string') { if (RE_ISHEADER.test(bodies[body])) {
// a body was given as a non-literal string, e.g. "foo" var parsed, data, headers;
if (RE_ISHEADER.test(bodies[body])) { //for (f = 0, lenf = fetches.length; f < lenf; ++f) {
var parsed, data, headers; if (fetches[i]._parse) {
//for (f = 0, lenf = fetches.length; f < lenf; ++f) { if (parsed === undefined)
if (fetches[i]._parse) { parsed = parsers.parseHeaders(val);
if (parsed === undefined) headers = parsed;
parsed = parsers.parseHeaders(val); } else {
headers = parsed; if (data === undefined)
} else { data = new Buffer(val, 'binary');
if (data === undefined) headers = data;
data = new Buffer(val, 'binary'); }
headers = data; fetches[i]._msg.emit('headers', headers);
} //}
fetches[i]._msg.emit('headers', headers); } else {
//} var data = new Buffer(val, 'binary');
} else { //for (f = 0, lenf = fetches.length; f < lenf; ++f)
var data = new Buffer(val, 'binary'); fetches[i]._msg.emit('data', data);
}
} else if (val === null) {
//for (f = 0, lenf = fetches.length; f < lenf; ++f) //for (f = 0, lenf = fetches.length; f < lenf; ++f)
fetches[i]._msg.emit('data', data); fetches[i].emit('message', fetches[i]._msg);
} }
} else if (val === null) {
//for (f = 0, lenf = fetches.length; f < lenf; ++f)
fetches[i].emit('message', fetches[i]._msg);
} }
} }
} }
for (body = 0, lenb = bodies.length; body < lenb; body += 2)
emitMsgEnd(bodies[body]);
} }
for (body = 0, lenb = bodies.length; body < lenb; body += 2)
emitMsgEnd(bodies[body]);
break; break;
case 'EXISTS': case 'EXISTS':
// mailbox total message count // mailbox total message count
@ -1198,7 +1201,6 @@ ImapConnection.prototype._storeLabels = function(which, uids, labels, mode, cb)
if (!Array.isArray(labels)) if (!Array.isArray(labels))
labels = [labels]; labels = [labels];
labels = labels.join(' '); labels = labels.join(' ');
cb = arguments[arguments.length-1];
this._send(which + 'STORE ' + uids.join(',') + ' ' + mode this._send(which + 'STORE ' + uids.join(',') + ' ' + mode
+ 'X-GM-LABELS.SILENT (' + labels + ')', cb); + 'X-GM-LABELS.SILENT (' + labels + ')', cb);
@ -1362,7 +1364,6 @@ ImapConnection.prototype._store = function(which, uids, flags, isAdding, cb) {
} }
} }
flags = flags.join(' '); flags = flags.join(' ');
cb = arguments[arguments.length-1];
this._send(which + 'STORE ' + uids.join(',') + ' ' + (isAdding ? '+' : '-') this._send(which + 'STORE ' + uids.join(',') + ' ' + (isAdding ? '+' : '-')
+ 'FLAGS.SILENT (' + flags + ')', cb); + 'FLAGS.SILENT (' + flags + ')', cb);

Loading…
Cancel
Save