imapflow 1.0.93 → 1.0.96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/lib/commands/fetch.js +1 -1
- package/lib/handler/token-parser.js +6 -1
- package/lib/imap-flow.js +4 -1
- package/lib/tools.js +1 -0
- package/lib/types.d.ts +4 -0
- package/package.json +6 -6
- package/test/imap-parser-test.js +16 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
- 1.0.96 - 2022-05-18
|
|
4
|
+
|
|
5
|
+
- Allow non-standard characters in ATOM if it's the string after NO/OK/BAD response
|
|
6
|
+
|
|
7
|
+
- 1.0.95 - 2022-05-03
|
|
8
|
+
|
|
9
|
+
- Do not use FETCH BINARY, unless `binary` option is `true`
|
|
10
|
+
|
|
11
|
+
- 1.0.94 - 2022-05-03
|
|
12
|
+
|
|
13
|
+
- Fixed source download
|
|
14
|
+
|
|
3
15
|
- 1.0.93 - 2022-05-03
|
|
4
16
|
|
|
5
17
|
- Fixed missing unicode encoding for APPEND, COPY, MOVE
|
package/lib/commands/fetch.js
CHANGED
|
@@ -18,7 +18,7 @@ module.exports = async (connection, range, query, options) => {
|
|
|
18
18
|
list: []
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
-
const commandKey = connection.capabilities.has('BINARY') && !connection.disableBinary ? 'BINARY' : 'BODY';
|
|
21
|
+
const commandKey = connection.capabilities.has('BINARY') && options.binary && !connection.disableBinary ? 'BINARY' : 'BODY';
|
|
22
22
|
|
|
23
23
|
let response;
|
|
24
24
|
try {
|
|
@@ -332,7 +332,12 @@ class TokenParser {
|
|
|
332
332
|
}
|
|
333
333
|
|
|
334
334
|
// if the char is not ATOM compatible, throw. Allow \* as an exception
|
|
335
|
-
if (
|
|
335
|
+
if (
|
|
336
|
+
imapFormalSyntax['ATOM-CHAR']().indexOf(chr) < 0 &&
|
|
337
|
+
chr !== ']' &&
|
|
338
|
+
!(chr === '*' && this.currentNode.value === '\\') &&
|
|
339
|
+
(!this.parent || !this.parent.command || !['NO', 'BAD', 'OK'].includes(this.parent.command))
|
|
340
|
+
) {
|
|
336
341
|
throw new Error('Unexpected char at position ' + (this.pos + i));
|
|
337
342
|
} else if (this.currentNode.value === '\\*') {
|
|
338
343
|
throw new Error('Unexpected char at position ' + (this.pos + i));
|
package/lib/imap-flow.js
CHANGED
|
@@ -623,7 +623,7 @@ class ImapFlow extends EventEmitter {
|
|
|
623
623
|
|
|
624
624
|
// Make sure we have namespace set. This should also throw if Exchange actually failed authentication
|
|
625
625
|
let nsResponse = await this.run('NAMESPACE');
|
|
626
|
-
if (nsResponse.error && nsResponse.status === 'BAD' && /User is authenticated but not connected/i.test(nsResponse.text)) {
|
|
626
|
+
if (nsResponse && nsResponse.error && nsResponse.status === 'BAD' && /User is authenticated but not connected/i.test(nsResponse.text)) {
|
|
627
627
|
// Not a NAMESPACE failure but authentication failure, so report as
|
|
628
628
|
this.authenticated = false;
|
|
629
629
|
let err = new Error('Authentication failed');
|
|
@@ -2014,6 +2014,7 @@ class ImapFlow extends EventEmitter {
|
|
|
2014
2014
|
* @param {Object} [options]
|
|
2015
2015
|
* @param {Boolean} [options.uid] If `true` then uses UID numbers instead of sequence numbers for `range`
|
|
2016
2016
|
* @param {BigInt} [options.changedSince] If set then only messages with a higher modseq value are returned. Ignored if server does not support `CONDSTORE` extension.
|
|
2017
|
+
* @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this
|
|
2017
2018
|
* @yields {Promise<FetchMessageObject>} Message data object
|
|
2018
2019
|
*
|
|
2019
2020
|
* @example
|
|
@@ -2065,6 +2066,7 @@ class ImapFlow extends EventEmitter {
|
|
|
2065
2066
|
|
|
2066
2067
|
this.run('FETCH', range, query, {
|
|
2067
2068
|
uid: !!options.uid,
|
|
2069
|
+
binary: options.binary,
|
|
2068
2070
|
changedSince: options.changedSince,
|
|
2069
2071
|
onUntaggedFetch: (untagged, next) => {
|
|
2070
2072
|
rowQueue.push({
|
|
@@ -2108,6 +2110,7 @@ class ImapFlow extends EventEmitter {
|
|
|
2108
2110
|
* @param {FetchQueryObject} query Fetch query
|
|
2109
2111
|
* @param {Object} [options]
|
|
2110
2112
|
* @param {Boolean} [options.uid] If `true` then uses UID number instead of sequence number for `seq`
|
|
2113
|
+
* @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this
|
|
2111
2114
|
* @returns {Promise<FetchMessageObject>} Message data object
|
|
2112
2115
|
*
|
|
2113
2116
|
* @example
|
package/lib/tools.js
CHANGED
package/lib/types.d.ts
CHANGED
|
@@ -414,10 +414,12 @@ declare module "imapflow" {
|
|
|
414
414
|
* @param query - Fetch query
|
|
415
415
|
* @param [options.uid] - If `true` then uses UID numbers instead of sequence numbers for `range`
|
|
416
416
|
* @param [options.changedSince] - If set then only messages with a higher modseq value are returned. Ignored if server does not support `CONDSTORE` extension.
|
|
417
|
+
* @param [options.binary = false] - If `true` then requests a binary response if the server supports this
|
|
417
418
|
*/
|
|
418
419
|
fetch(range: SequenceString | Number[] | SearchObject, query: FetchQueryObject, options?: {
|
|
419
420
|
uid?: boolean;
|
|
420
421
|
changedSince?: bigint;
|
|
422
|
+
binary?: boolean;
|
|
421
423
|
}): void;
|
|
422
424
|
/**
|
|
423
425
|
* Fetch a single message from currently opened mailbox
|
|
@@ -429,10 +431,12 @@ declare module "imapflow" {
|
|
|
429
431
|
* @param seq - Single UID or sequence number of the message to fetch for
|
|
430
432
|
* @param query - Fetch query
|
|
431
433
|
* @param [options.uid] - If `true` then uses UID number instead of sequence number for `seq`
|
|
434
|
+
* @param [options.binary = false] - If `true` then requests a binary response if the server supports this
|
|
432
435
|
* @returns Message data object
|
|
433
436
|
*/
|
|
434
437
|
fetchOne(seq: SequenceString, query: FetchQueryObject, options?: {
|
|
435
438
|
uid?: boolean;
|
|
439
|
+
binary?: boolean;
|
|
436
440
|
}): Promise<FetchMessageObject>;
|
|
437
441
|
/**
|
|
438
442
|
* Download either full rfc822 formated message or a specific bodystructure part as a Stream.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "imapflow",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.96",
|
|
4
4
|
"description": "IMAP Client for Node",
|
|
5
5
|
"main": "./lib/imap-flow.js",
|
|
6
6
|
"scripts": {
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"@babel/eslint-parser": "7.17.0",
|
|
31
31
|
"@babel/eslint-plugin": "7.17.7",
|
|
32
32
|
"@babel/plugin-syntax-class-properties": "7.12.13",
|
|
33
|
-
"@babel/preset-env": "7.17.
|
|
34
|
-
"@types/node": "17.0.
|
|
33
|
+
"@babel/preset-env": "7.17.12",
|
|
34
|
+
"@types/node": "17.0.34",
|
|
35
35
|
"braintree-jsdoc-template": "3.3.0",
|
|
36
|
-
"eslint": "8.
|
|
36
|
+
"eslint": "8.15.0",
|
|
37
37
|
"eslint-config-nodemailer": "1.2.0",
|
|
38
38
|
"eslint-config-prettier": "8.5.0",
|
|
39
|
-
"grunt": "1.5.
|
|
39
|
+
"grunt": "1.5.3",
|
|
40
40
|
"grunt-cli": "1.4.3",
|
|
41
41
|
"grunt-contrib-nodeunit": "4.0.0",
|
|
42
42
|
"grunt-eslint": "24.0.0",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"libmime": "5.1.0",
|
|
52
52
|
"libqp": "1.1.0",
|
|
53
53
|
"mailsplit": "5.3.2",
|
|
54
|
-
"nodemailer": "6.7.
|
|
54
|
+
"nodemailer": "6.7.5",
|
|
55
55
|
"pino": "7.11.0",
|
|
56
56
|
"socks": "2.6.2"
|
|
57
57
|
}
|
package/test/imap-parser-test.js
CHANGED
|
@@ -905,3 +905,19 @@ module.exports['IMAP Parser: escaped quotes'] = test =>
|
|
|
905
905
|
);
|
|
906
906
|
|
|
907
907
|
module.exports['IMAP Parser: mimetorture'] = test => asyncWrapper(test, async test => test.deepEqual(await parser(mimetorture.input), mimetorture.output));
|
|
908
|
+
|
|
909
|
+
module.exports['IMAP Parser, unicode select'] = test =>
|
|
910
|
+
asyncWrapper(test, async test =>
|
|
911
|
+
test.deepEqual((await parser('F OK [READ-WRITE] [Gmail]/Visi laiškai selected. (Success) [THROTTLED]')).attributes, [
|
|
912
|
+
{
|
|
913
|
+
type: 'ATOM',
|
|
914
|
+
value: '',
|
|
915
|
+
section: [{ type: 'ATOM', value: 'READ-WRITE' }]
|
|
916
|
+
},
|
|
917
|
+
{ type: 'ATOM', value: '[Gmail]/Visi' },
|
|
918
|
+
{ type: 'ATOM', value: 'laiškai' },
|
|
919
|
+
{ type: 'ATOM', value: 'selected.' },
|
|
920
|
+
[{ type: 'ATOM', value: 'Success' }],
|
|
921
|
+
{ type: 'ATOM', value: '[THROTTLED]' }
|
|
922
|
+
])
|
|
923
|
+
);
|