emailengine-app 2.61.0 → 2.61.2

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.
Files changed (137) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/data/google-crawlers.json +1 -1
  3. package/lib/account/account-state.js +248 -0
  4. package/lib/account.js +17 -178
  5. package/lib/api-routes/account-routes.js +1006 -0
  6. package/lib/api-routes/message-routes.js +1377 -0
  7. package/lib/consts.js +12 -2
  8. package/lib/email-client/base-client.js +282 -771
  9. package/lib/email-client/gmail/gmail-api.js +243 -0
  10. package/lib/email-client/gmail-client.js +145 -53
  11. package/lib/email-client/imap/mailbox.js +24 -698
  12. package/lib/email-client/imap/sync-operations.js +812 -0
  13. package/lib/email-client/imap-client.js +3 -1
  14. package/lib/email-client/message-builder.js +566 -0
  15. package/lib/email-client/notification-handler.js +314 -0
  16. package/lib/email-client/outlook/graph-api.js +326 -0
  17. package/lib/email-client/outlook-client.js +159 -113
  18. package/lib/email-client/smtp-pool-manager.js +196 -0
  19. package/lib/imapproxy/imap-server.js +3 -12
  20. package/lib/oauth/gmail.js +4 -4
  21. package/lib/oauth/mail-ru.js +30 -5
  22. package/lib/oauth/outlook.js +57 -3
  23. package/lib/oauth/pubsub/google.js +30 -11
  24. package/lib/oauth/scope-checker.js +202 -0
  25. package/lib/oauth2-apps.js +8 -4
  26. package/lib/redis-operations.js +484 -0
  27. package/lib/routes-ui.js +283 -2582
  28. package/lib/tools.js +5 -196
  29. package/lib/ui-routes/account-routes.js +1931 -0
  30. package/lib/ui-routes/admin-config-routes.js +1233 -0
  31. package/lib/ui-routes/admin-entities-routes.js +2367 -0
  32. package/lib/ui-routes/oauth-routes.js +992 -0
  33. package/lib/utils/network.js +237 -0
  34. package/package.json +12 -12
  35. package/sbom.json +1 -1
  36. package/static/js/app.js +5 -5
  37. package/static/licenses.html +91 -21
  38. package/translations/de.mo +0 -0
  39. package/translations/de.po +85 -82
  40. package/translations/en.mo +0 -0
  41. package/translations/en.po +63 -71
  42. package/translations/et.mo +0 -0
  43. package/translations/et.po +84 -82
  44. package/translations/fr.mo +0 -0
  45. package/translations/fr.po +85 -82
  46. package/translations/ja.mo +0 -0
  47. package/translations/ja.po +84 -82
  48. package/translations/messages.pot +67 -80
  49. package/translations/nl.mo +0 -0
  50. package/translations/nl.po +86 -82
  51. package/translations/pl.mo +0 -0
  52. package/translations/pl.po +84 -82
  53. package/views/account/security.hbs +4 -4
  54. package/views/accounts/account.hbs +13 -13
  55. package/views/accounts/register/imap-server.hbs +12 -12
  56. package/views/config/document-store/pre-processing/index.hbs +4 -2
  57. package/views/config/oauth/app.hbs +6 -7
  58. package/views/config/oauth/index.hbs +2 -2
  59. package/views/config/service.hbs +3 -4
  60. package/views/dashboard.hbs +5 -7
  61. package/views/error.hbs +22 -7
  62. package/views/gateways/gateway.hbs +2 -2
  63. package/views/partials/add_account_modal.hbs +7 -10
  64. package/views/partials/document_store_header.hbs +1 -1
  65. package/views/partials/editor_scope_info.hbs +0 -1
  66. package/views/partials/oauth_config_header.hbs +1 -1
  67. package/views/partials/side_menu.hbs +3 -3
  68. package/views/partials/webhook_form.hbs +2 -2
  69. package/views/templates/index.hbs +1 -1
  70. package/views/templates/template.hbs +8 -8
  71. package/views/tokens/index.hbs +6 -6
  72. package/views/tokens/new.hbs +1 -1
  73. package/views/webhooks/index.hbs +4 -4
  74. package/views/webhooks/webhook.hbs +7 -7
  75. package/workers/api.js +148 -2436
  76. package/workers/smtp.js +2 -1
  77. package/workers/webhooks.js +6 -0
  78. package/lib/imapproxy/imap-core/test/client.js +0 -46
  79. package/lib/imapproxy/imap-core/test/fixtures/append.eml +0 -1196
  80. package/lib/imapproxy/imap-core/test/fixtures/chunks.js +0 -44
  81. package/lib/imapproxy/imap-core/test/fixtures/fix1.eml +0 -6
  82. package/lib/imapproxy/imap-core/test/fixtures/fix2.eml +0 -599
  83. package/lib/imapproxy/imap-core/test/fixtures/fix3.eml +0 -32
  84. package/lib/imapproxy/imap-core/test/fixtures/fix4.eml +0 -6
  85. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.eml +0 -599
  86. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.js +0 -2740
  87. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.json +0 -1411
  88. package/lib/imapproxy/imap-core/test/fixtures/mimetree.js +0 -85
  89. package/lib/imapproxy/imap-core/test/fixtures/nodemailer.eml +0 -582
  90. package/lib/imapproxy/imap-core/test/fixtures/ryan_finnie_mime_torture.eml +0 -599
  91. package/lib/imapproxy/imap-core/test/fixtures/simple.eml +0 -42
  92. package/lib/imapproxy/imap-core/test/fixtures/simple.json +0 -164
  93. package/lib/imapproxy/imap-core/test/imap-compile-stream-test.js +0 -671
  94. package/lib/imapproxy/imap-core/test/imap-compiler-test.js +0 -272
  95. package/lib/imapproxy/imap-core/test/imap-indexer-test.js +0 -236
  96. package/lib/imapproxy/imap-core/test/imap-parser-test.js +0 -922
  97. package/lib/imapproxy/imap-core/test/memory-notifier.js +0 -129
  98. package/lib/imapproxy/imap-core/test/prepare.sh +0 -74
  99. package/lib/imapproxy/imap-core/test/protocol-test.js +0 -1756
  100. package/lib/imapproxy/imap-core/test/search-test.js +0 -1356
  101. package/lib/imapproxy/imap-core/test/test-client.js +0 -152
  102. package/lib/imapproxy/imap-core/test/test-server.js +0 -623
  103. package/lib/imapproxy/imap-core/test/tools-test.js +0 -22
  104. package/test/api-test.js +0 -899
  105. package/test/autoreply-test.js +0 -327
  106. package/test/bounce-test.js +0 -151
  107. package/test/complaint-test.js +0 -256
  108. package/test/fixtures/autoreply/LICENSE +0 -27
  109. package/test/fixtures/autoreply/rfc3834-01.eml +0 -23
  110. package/test/fixtures/autoreply/rfc3834-02.eml +0 -24
  111. package/test/fixtures/autoreply/rfc3834-03.eml +0 -26
  112. package/test/fixtures/autoreply/rfc3834-04.eml +0 -48
  113. package/test/fixtures/autoreply/rfc3834-05.eml +0 -19
  114. package/test/fixtures/autoreply/rfc3834-06.eml +0 -59
  115. package/test/fixtures/bounces/163.eml +0 -2521
  116. package/test/fixtures/bounces/fastmail.eml +0 -242
  117. package/test/fixtures/bounces/gmail.eml +0 -252
  118. package/test/fixtures/bounces/hotmail.eml +0 -655
  119. package/test/fixtures/bounces/mailru.eml +0 -121
  120. package/test/fixtures/bounces/outlook.eml +0 -1107
  121. package/test/fixtures/bounces/postfix.eml +0 -101
  122. package/test/fixtures/bounces/rambler.eml +0 -116
  123. package/test/fixtures/bounces/workmail.eml +0 -142
  124. package/test/fixtures/bounces/yahoo.eml +0 -139
  125. package/test/fixtures/bounces/zoho.eml +0 -83
  126. package/test/fixtures/bounces/zonemta.eml +0 -100
  127. package/test/fixtures/complaints/LICENSE +0 -27
  128. package/test/fixtures/complaints/amazonses.eml +0 -72
  129. package/test/fixtures/complaints/dmarc.eml +0 -59
  130. package/test/fixtures/complaints/hotmail.eml +0 -49
  131. package/test/fixtures/complaints/optout.eml +0 -40
  132. package/test/fixtures/complaints/standard-arf.eml +0 -68
  133. package/test/fixtures/complaints/yahoo.eml +0 -68
  134. package/test/oauth2-apps-test.js +0 -301
  135. package/test/sendonly-test.js +0 -160
  136. package/test/test-config.js +0 -34
  137. package/test/webhooks-server.js +0 -39
@@ -1,129 +0,0 @@
1
- 'use strict';
2
-
3
- let EventEmitter = require('events').EventEmitter;
4
-
5
- // Expects that the folder listing is a Map
6
-
7
- class MemoryNotifier extends EventEmitter {
8
- constructor(options) {
9
- super();
10
- this.folders = options.folders || new Map();
11
-
12
- let logfunc = (...args) => {
13
- let level = args.shift() || 'DEBUG';
14
- let message = args.shift() || '';
15
-
16
- console.log([level].concat(message || '').join(' '), ...args);
17
- };
18
-
19
- this.logger = options.logger || {
20
- info: logfunc.bind(null, 'INFO'),
21
- debug: logfunc.bind(null, 'DEBUG'),
22
- error: logfunc.bind(null, 'ERROR')
23
- };
24
-
25
- this._listeners = new EventEmitter();
26
- this._listeners.setMaxListeners(0);
27
-
28
- EventEmitter.call(this);
29
- }
30
-
31
- /**
32
- * Registers an event handler for mailbox:username events
33
- *
34
- * @param {String} username
35
- * @param {String} mailbox
36
- * @param {Function} handler Function to run once there are new entries in the journal
37
- */
38
- addListener(session, handler) {
39
- this._listeners.addListener(session.user.id.toString(), handler);
40
- }
41
-
42
- /**
43
- * Unregisters an event handler for mailbox:username events
44
- *
45
- * @param {String} username
46
- * @param {String} mailbox
47
- * @param {Function} handler Function to run once there are new entries in the journal
48
- */
49
- removeListener(session, handler) {
50
- this._listeners.removeListener(session.user.id.toString(), handler);
51
- }
52
-
53
- /**
54
- * Stores multiple journal entries to db
55
- *
56
- * @param {String} username
57
- * @param {String} mailbox
58
- * @param {Array|Object} entries An array of entries to be journaled
59
- * @param {Function} callback Runs once the entry is either stored or an error occurred
60
- */
61
- addEntries(mailbox, entries, callback) {
62
- let folder = this.folders.get(mailbox);
63
-
64
- if (!folder) {
65
- return callback(null, new Error('Selected mailbox does not exist'));
66
- }
67
-
68
- if (entries && !Array.isArray(entries)) {
69
- entries = [entries];
70
- } else if (!entries || !entries.length) {
71
- return callback(null, false);
72
- }
73
-
74
- // store entries in the folder object
75
- if (!folder.journal) {
76
- folder.journal = [];
77
- }
78
-
79
- entries.forEach(entry => {
80
- entry.modseq = ++folder.modifyIndex;
81
- folder.journal.push(entry);
82
- });
83
-
84
- setImmediate(callback);
85
- }
86
-
87
- /**
88
- * Sends a notification that there are new updates in the selected mailbox
89
- *
90
- * @param {String} username
91
- * @param {String} mailbox
92
- */
93
- fire(username, payload) {
94
- setImmediate(() => {
95
- this._listeners.emit(username, payload);
96
- });
97
- }
98
-
99
- /**
100
- * Returns all entries from the journal that have higher than provided modification index
101
- *
102
- * @param {String} username
103
- * @param {String} mailbox
104
- * @param {Number} modifyIndex Last known modification id
105
- * @param {Function} callback Returns update entries as an array
106
- */
107
- getUpdates(mailbox, modifyIndex, callback) {
108
- modifyIndex = Number(modifyIndex) || 0;
109
-
110
- if (!this.folders.has(mailbox)) {
111
- return callback(null, 'NONEXISTENT');
112
- }
113
-
114
- let folder = this.folders.get(mailbox);
115
- let minIndex = folder.journal.length;
116
-
117
- for (let i = folder.journal.length - 1; i >= 0; i--) {
118
- if (folder.journal[i].modseq > modifyIndex) {
119
- minIndex = i;
120
- } else {
121
- break;
122
- }
123
- }
124
-
125
- return callback(null, folder.journal.slice(minIndex));
126
- }
127
- }
128
-
129
- module.exports = MemoryNotifier;
@@ -1,74 +0,0 @@
1
- #!/bin/bash
2
-
3
- DBNAME="$1"
4
-
5
- echo "Clearing DB"
6
- mongo "$DBNAME" --eval "db.getCollectionNames().forEach(function(key){db[key].deleteMany({});})" > /dev/null
7
-
8
- echo "Creating user"
9
- USERRESPONSE=`curl --silent -XPOST http://127.0.0.1:8080/users \
10
- -H 'Content-type: application/json' \
11
- -d '{
12
- "username": "testuser",
13
- "password": "pass",
14
- "name": "Test User"
15
- }'`
16
- echo "UR: $USERRESPONSE"
17
- USERID=`echo "$USERRESPONSE" | jq -r '.id'`
18
-
19
- echo "Reading Mailbox ID"
20
- MAILBOXLIST=`curl --silent "http://127.0.0.1:8080/users/$USERID/mailboxes"`
21
- echo "ML: $MAILBOXLIST"
22
- echo "$MAILBOXLIST" | jq
23
- INBOXID=`echo "$MAILBOXLIST" | jq -r '.results[0].id'`
24
- SENTID=`echo "$MAILBOXLIST" | jq -r '.results[3].id'`
25
-
26
- curl --silent -XPUT "http://127.0.0.1:8080/users/$USERID/mailboxes/$SENTID" \
27
- -H 'Content-type: application/json' \
28
- -d '{
29
- "path": "[Gmail]/Sent Mail"
30
- }'
31
-
32
- MAILBOXLIST=`curl --silent "http://127.0.0.1:8080/users/$USERID/mailboxes"`
33
- echo "$MAILBOXLIST" | jq
34
-
35
- curl --silent -XPOST "http://127.0.0.1:8080/users/$USERID/mailboxes/$INBOXID/messages?date=14-Sep-2013%2021%3A22%3A28%20-0300&unseen=true" \
36
- -H 'Content-type: message/rfc822' \
37
- --data-binary "@fixtures/fix1.eml"
38
-
39
- curl --silent -XPOST "http://127.0.0.1:8080/users/$USERID/mailboxes/$INBOXID/messages?unseen=false" \
40
- -H 'Content-type: message/rfc822' \
41
- --data-binary "@fixtures/fix2.eml"
42
-
43
- curl --silent -XPOST "http://127.0.0.1:8080/users/$USERID/mailboxes/$INBOXID/messages?unseen=false" \
44
- -H 'Content-type: message/rfc822' \
45
- --data-binary "@fixtures/fix3.eml"
46
-
47
- curl --silent -XPOST "http://127.0.0.1:8080/users/$USERID/mailboxes/$INBOXID/messages?unseen=true" \
48
- -H 'Content-type: message/rfc822' \
49
- --data-binary "@fixtures/fix4.eml"
50
-
51
- curl --silent -XPOST "http://127.0.0.1:8080/users/$USERID/mailboxes/$INBOXID/messages?unseen=true" \
52
- -H 'Content-type: message/rfc822' \
53
- --data-binary "from: sender@example.com
54
- to: receiver@example.com
55
- subject: test5
56
-
57
- hello 5
58
- "
59
-
60
- curl --silent -XPOST "http://127.0.0.1:8080/users/$USERID/mailboxes/$INBOXID/messages?unseen=true" \
61
- -H 'Content-type: message/rfc822' \
62
- --data-binary "from: sender@example.com
63
- to: receiver@example.com
64
- subject: test6
65
-
66
- hello 6
67
- "
68
-
69
- mongo "$DBNAME" --eval "db.mailboxes.updateOne({_id: ObjectId('$INBOXID')}, {\$set:{modifyIndex: 5000, uidNext: 1000}});
70
- db.messages.updateOne({mailbox: ObjectId('$INBOXID'), uid:1}, {\$set:{modseq: 100}});
71
- db.messages.updateOne({mailbox: ObjectId('$INBOXID'), uid:2}, {\$set:{modseq: 5000}});
72
- db.messages.updateMany({}, {\$inc:{uid: 100}});" > /dev/null
73
-
74
- # curl --silent "http://127.0.0.1:8080/users/$USERID/mailboxes/$INBOXID/messages" | jq