imapflow 1.0.83 → 1.0.86

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # CHANGELOG
2
2
 
3
+ - 1.0.86 - 2022-03-14
4
+
5
+ - Do not try to decode mailbox path from utf7 as methods expect utf-8 not utf-7
6
+
7
+ - 1.0.85 - 2022-02-23
8
+
9
+ - Trim null bytes in the beginning of IMAP responses to deal with a buggy server that pads responses with null bytes
10
+
11
+ - 1.0.84 - 2022-02-17
12
+
13
+ - QRESYNC tweaks
14
+
3
15
  - 1.0.83 - 2022-02-16
4
16
 
5
17
  - QRESYNC tweaks
package/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2020-2021 Postal Systems OÜ
1
+ Copyright (c) 2020-2022 Postal Systems OÜ
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -80,6 +80,6 @@ main().catch(err => console.error(err));
80
80
 
81
81
  ## License
82
82
 
83
- © 2020-2021 Postal Systems OÜ
83
+ © 2020-2022 Postal Systems OÜ
84
84
 
85
85
  Licensed under **MIT-license**
@@ -40,8 +40,8 @@ module.exports = async (connection, path, options) => {
40
40
  extraArgs.push([
41
41
  { type: 'ATOM', value: 'QRESYNC' },
42
42
  [
43
- { type: 'ATOM', value: options.uidValidity },
44
- { type: 'ATOM', value: options.changedSince }
43
+ { type: 'ATOM', value: options.uidValidity.toString() },
44
+ { type: 'ATOM', value: options.changedSince.toString() }
45
45
  ]
46
46
  ]);
47
47
  map.qresync = true;
@@ -156,6 +156,19 @@ module.exports = async (connection, path, options) => {
156
156
  }
157
157
  }
158
158
 
159
+ if (
160
+ map.qresync &&
161
+ // UIDVALIDITY must be the same
162
+ (options.uidValidity !== map.uidValidity ||
163
+ // HIGHESTMODSEQ response must be present
164
+ !map.highestModseq ||
165
+ // NOMODSEQ is not allowed
166
+ map.noModseq)
167
+ ) {
168
+ // QRESYNC does not apply here, so unset it
169
+ map.qresync = false;
170
+ }
171
+
159
172
  let currentMailbox = connection.mailbox;
160
173
  connection.mailbox = false;
161
174
 
@@ -6,6 +6,21 @@ const { ParserInstance } = require('./parser-instance');
6
6
  module.exports = async (command, options) => {
7
7
  options = options || {};
8
8
 
9
+ let nullBytesRemoved = 0;
10
+
11
+ // special case with a buggy IMAP server where responses are padded with zero bytes
12
+ if (command[0] === 0) {
13
+ // find the first non null byte and trim
14
+ for (let i = 0; i < command.length; i++) {
15
+ if (command[i] !== 0) {
16
+ // trim to here
17
+ command = command.slice(i);
18
+ nullBytesRemoved = i;
19
+ break;
20
+ }
21
+ }
22
+ }
23
+
9
24
  const parser = new ParserInstance(command, options);
10
25
  const response = {};
11
26
 
@@ -13,6 +28,10 @@ module.exports = async (command, options) => {
13
28
  await parser.getSpace();
14
29
  response.command = await parser.getCommand();
15
30
 
31
+ if (nullBytesRemoved) {
32
+ response.nullBytesRemoved = nullBytesRemoved;
33
+ }
34
+
16
35
  if (['UID', 'AUTHENTICATE'].indexOf((response.command || '').toUpperCase()) >= 0) {
17
36
  await parser.getSpace();
18
37
  response.command += ' ' + (await parser.getElement(imapFormalSyntax.command()));
package/lib/imap-flow.js CHANGED
@@ -424,9 +424,9 @@ class ImapFlow extends EventEmitter {
424
424
 
425
425
  if (/^\d+$/.test(parsed.command) && parsed.attributes && parsed.attributes[0] && parsed.attributes[0].value === 'FETCH') {
426
426
  // too many FETCH responses, might want to filter these out
427
- this.log.trace({ src: 's', msg: logCompiled.toString(), cid: this.id });
427
+ this.log.trace({ src: 's', msg: logCompiled.toString(), cid: this.id, nullBytesRemoved: parsed.nullBytesRemoved });
428
428
  } else {
429
- this.log.debug({ src: 's', msg: logCompiled.toString(), cid: this.id });
429
+ this.log.debug({ src: 's', msg: logCompiled.toString(), cid: this.id, nullBytesRemoved: parsed.nullBytesRemoved });
430
430
  }
431
431
 
432
432
  if (parsed.tag === '+' && this.currentRequest && this.currentRequest.options && typeof this.currentRequest.options.onPlusTag === 'function') {
package/lib/tools.js CHANGED
@@ -23,12 +23,6 @@ module.exports = {
23
23
  } catch (err) {
24
24
  // ignore, keep name as is
25
25
  }
26
- } else if (connection.enabled.has('UTF8=ACCEPT') && /&/.test(path)) {
27
- try {
28
- path = iconv.decode(Buffer.from(path), 'utf-7-imap').toString();
29
- } catch (err) {
30
- // ignore, keep name as is
31
- }
32
26
  }
33
27
 
34
28
  // ensure namespace prefix if needed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imapflow",
3
- "version": "1.0.83",
3
+ "version": "1.0.86",
4
4
  "description": "IMAP Client for Node",
5
5
  "main": "./lib/imap-flow.js",
6
6
  "scripts": {
@@ -27,14 +27,14 @@
27
27
  "homepage": "https://imapflow.com/",
28
28
  "devDependencies": {
29
29
  "@babel/eslint-parser": "7.17.0",
30
- "@babel/eslint-plugin": "7.16.5",
30
+ "@babel/eslint-plugin": "7.17.7",
31
31
  "@babel/plugin-syntax-class-properties": "7.12.13",
32
32
  "@babel/preset-env": "7.16.11",
33
- "@types/node": "17.0.18",
33
+ "@types/node": "17.0.21",
34
34
  "braintree-jsdoc-template": "3.3.0",
35
- "eslint": "8.9.0",
35
+ "eslint": "8.11.0",
36
36
  "eslint-config-nodemailer": "1.2.0",
37
- "eslint-config-prettier": "8.3.0",
37
+ "eslint-config-prettier": "8.5.0",
38
38
  "grunt": "1.4.1",
39
39
  "grunt-cli": "1.4.3",
40
40
  "grunt-contrib-nodeunit": "4.0.0",
@@ -50,7 +50,7 @@
50
50
  "libqp": "1.1.0",
51
51
  "mailsplit": "5.3.1",
52
52
  "nodemailer": "6.7.2",
53
- "pino": "7.8.0",
53
+ "pino": "7.8.1",
54
54
  "socks": "2.6.2"
55
55
  }
56
56
  }