Skip to content

Commit

Permalink
fix(oauth): Added 'useAuthServer' support for API based email accounts
Browse files Browse the repository at this point in the history
  • Loading branch information
andris9 committed Oct 6, 2024
1 parent a34f20a commit 04c2aa9
Show file tree
Hide file tree
Showing 13 changed files with 53 additions and 34 deletions.
17 changes: 16 additions & 1 deletion lib/account.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
const logger = require('./logger');
const Boom = require('@hapi/boom');
const msgpack = require('msgpack5')();
const { normalizePath, formatAccountListingResponse, unpackUIDRangeForSearch, mergeObjects, download } = require('./tools');
const { normalizePath, formatAccountListingResponse, unpackUIDRangeForSearch, mergeObjects, download, resolveCredentials } = require('./tools');
const crypto = require('crypto');
const { MessageChannel } = require('worker_threads');
const { MessagePortReadable } = require('./message-port-stream');
Expand Down Expand Up @@ -2289,6 +2289,21 @@ class Account {
throw error;
}

if (accountData.oauth2.useAuthServer) {
// resolve credentials

let authData = await resolveCredentials(this.account, 'api');

return {
account: accountData.account,
user: authData.user,
accessToken: authData.accessToken,
provider: accountData.oauth2.auth.provider,
registeredScopes: accountData.oauth2.scope,
cached: false
};
}

let now = Date.now();
let accessToken;
let cached = false;
Expand Down
File renamed without changes.
File renamed without changes.
28 changes: 14 additions & 14 deletions lib/imap-connection.js → lib/email-client/imap-client.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@

const { parentPort } = require('worker_threads');
const { ImapFlow } = require('imapflow');
const { Mailbox } = require('./mailbox');
const logger = require('./logger');
const packageData = require('../package.json');
const { Mailbox } = require('./imap/mailbox');
const logger = require('../logger');
const packageData = require('../../package.json');
const { backOff } = require('exponential-backoff');
const msgpack = require('msgpack5')();
const nodemailer = require('nodemailer');
const util = require('util');
const { removeBcc } = require('./get-raw-email');
const { removeBcc } = require('../get-raw-email');
const socks = require('socks');
const { Gateway } = require('./gateway');
const { Gateway } = require('../gateway');

const { oauth2Apps, oauth2ProviderData } = require('./oauth2-apps');
const { BaseClient } = require('./api-client/base-client');
const { oauth2Apps, oauth2ProviderData } = require('../oauth2-apps');
const { BaseClient } = require('./base-client');

const { Subconnection } = require('./subconnection');
const { Subconnection } = require('./imap/subconnection');

const {
getLocalAddress,
Expand All @@ -28,7 +28,7 @@ const {
readEnvValue,
validUidValidity,
getDuration
} = require('./tools');
} = require('../tools');

const RESYNC_DELAY = 15 * 60;
const ENSURE_MAIN_TTL = 5 * 1000;
Expand All @@ -42,16 +42,16 @@ const {
DEFAULT_DOWNLOAD_CHUNK_SIZE,
MAX_BACKOFF_DELAY,
TLS_DEFAULTS
} = require('./consts');
} = require('../consts');

const DOWNLOAD_CHUNK_SIZE = getByteSize(readEnvValue('EENGINE_CHUNK_SIZE')) || DEFAULT_DOWNLOAD_CHUNK_SIZE;
const DISABLE_IMAP_COMPRESSION = getBoolean(readEnvValue('EENGINE_DISABLE_COMPRESSION'));
const IMAP_SOCKET_TIMEOUT = getDuration(readEnvValue('EENGINE_IMAP_SOCKET_TIMEOUT'));

logger.trace({ msg: 'Worker configuration', DOWNLOAD_CHUNK_SIZE, DISABLE_IMAP_COMPRESSION, IMAP_SOCKET_TIMEOUT });

const settings = require('./settings');
const { redis } = require('./db');
const settings = require('../settings');
const { redis } = require('../db');

async function metricsMeta(meta, logger, key, method, ...args) {
try {
Expand All @@ -67,7 +67,7 @@ async function metricsMeta(meta, logger, key, method, ...args) {
}
}

class IMAPConnection extends BaseClient {
class IMAPClient extends BaseClient {
constructor(account, options) {
super(account, options);

Expand Down Expand Up @@ -2593,4 +2593,4 @@ class IMAPConnection extends BaseClient {
}
}

module.exports = { IMAPConnection };
module.exports = { IMAPClient };
16 changes: 8 additions & 8 deletions lib/mailbox.js → lib/email-client/imap/mailbox.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,21 @@ const {
validUidValidity,
calculateFetchBackoff,
readEnvValue
} = require('./tools');
} = require('../../tools');
const msgpack = require('msgpack5')();
const he = require('he');
const libmime = require('libmime');
const settings = require('./settings');
const settings = require('../../settings');
const config = require('wild-config');
const { bounceDetect } = require('./bounce-detect');
const { arfDetect } = require('./arf-detect');
const appendList = require('./append-list');
const { bounceDetect } = require('../../bounce-detect');
const { arfDetect } = require('../../arf-detect');
const appendList = require('../../append-list');
const { mimeHtml } = require('@postalsys/email-text-tools');
const simpleParser = require('mailparser').simpleParser;
const ical = require('ical.js');
const { llmPreProcess } = require('./llm-pre-process');
const { llmPreProcess } = require('../../llm-pre-process');

const { getESClient } = require('./document-store');
const { getESClient } = require('../../document-store');

const {
MESSAGE_NEW_NOTIFY,
Expand All @@ -42,7 +42,7 @@ const {
MAX_ALLOWED_DOWNLOAD_SIZE,
DEFAULT_FETCH_BATCH_SIZE,
MAILBOX_HASH
} = require('./consts');
} = require('../../consts');

const FETCH_BATCH_SIZE = Number(readEnvValue('EENGINE_FETCH_BATCH_SIZE') || config.service.fetchBatchSize) || DEFAULT_FETCH_BATCH_SIZE;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const { ImapFlow } = require('imapflow');
const { backOff } = require('exponential-backoff');
const EventEmitter = require('events').EventEmitter;

const { MAX_BACKOFF_DELAY } = require('./consts');
const { MAX_BACKOFF_DELAY } = require('../../consts');

const MAX_WAIT_DELAY = 450; //ms

Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion lib/imapproxy/imap-core/lib/commands/starttls.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ module.exports = {

/**
* Upgrades current socket to use TLS
* @param {Object} connection IMAPConnection instance
* @param {Object} connection IMAPClient instance
*/
function upgrade(connection) {
connection._socket.unpipe(connection._parser);
Expand Down
4 changes: 2 additions & 2 deletions lib/imapproxy/imap-core/lib/imap-connection.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const SOCKET_TIMEOUT = 5 * 60 * 1000;
* @param {Object} server Server instance
* @param {Object} socket Socket instance
*/
class IMAPConnection extends EventEmitter {
class IMAPClient extends EventEmitter {
constructor(server, socket, options) {
super();

Expand Down Expand Up @@ -926,4 +926,4 @@ class IMAPConnection extends EventEmitter {
}

// Expose to the world
module.exports.IMAPConnection = IMAPConnection;
module.exports.IMAPClient = IMAPClient;
4 changes: 2 additions & 2 deletions lib/imapproxy/imap-core/lib/imap-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
const net = require('net');
const tls = require('tls');
const crypto = require('crypto');
const IMAPConnection = require('./imap-connection').IMAPConnection;
const IMAPClient = require('./imap-connection').IMAPClient;
const tlsOptions = require('./tls-options');
const EventEmitter = require('events').EventEmitter;
const shared = require('nodemailer/lib/shared');
Expand Down Expand Up @@ -82,7 +82,7 @@ class IMAPServer extends EventEmitter {
}

connect(socket, socketOptions) {
let connection = new IMAPConnection(this, socket, socketOptions);
let connection = new IMAPClient(this, socket, socketOptions);
connection.loggelf = message => this.loggelf(message);
this.connections.add(connection);
connection.on('error', this._onError.bind(this));
Expand Down
4 changes: 4 additions & 0 deletions lib/schemas.js
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,8 @@ const oauth2Schema = {

auth: oauth2AuthSchema,

useAuthServer: Joi.boolean().example(false).description('Set to true to use authentication server instead of managing access tokens'),

accessToken: Joi.string()
.max(4 * 4096)
.example('ya29.a0ARrdaM8a...'),
Expand Down Expand Up @@ -758,6 +760,8 @@ const oauth2UpdateSchema = {

auth: oauth2AuthSchema,

useAuthServer: Joi.boolean().example(false).description('Set to true to use authentication server instead of managing access tokens'),

accessToken: Joi.string()
.max(4 * 4096)
.example('ya29.a0ARrdaM8a...'),
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"gettext": "find ./views -name \"*.hbs\" -print0 | xargs -0 xgettext-template -L Handlebars -o translations/messages.pot --force-po && jsxgettext lib/routes-ui.js workers/api.js lib/tools.js -j -o translations/messages.pot",
"prepare-docker": "echo \"EE_DOCKER_LEGACY=$EE_DOCKER_LEGACY\" >> system.env && cat system.env",
"update": "rm -rf node_modules package-lock.json && ncu -u && npm install && ./copy-static-files.sh && npm run licenses && npm run gettext",
"test-gmail-api": "node lib/api-client/gmail-client.js --dbs.redis=redis://127.0.0.1/11"
"test-gmail-api": "node lib/email-client/gmail-client.js --dbs.redis=redis://127.0.0.1/11"
},
"keywords": [
"IMAP",
Expand Down
8 changes: 4 additions & 4 deletions workers/imap.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ if (readEnvValue('BUGSNAG_API_KEY')) {
logger.notifyError = Bugsnag.notify.bind(Bugsnag);
}

const { IMAPConnection } = require('../lib/imap-connection');
const { GmailClient } = require('../lib/api-client/gmail-client');
const { OutlookClient } = require('../lib/api-client/outlook-client');
const { IMAPClient } = require('../lib/email-client/imap-client');
const { GmailClient } = require('../lib/email-client/gmail-client');
const { OutlookClient } = require('../lib/email-client/outlook-client');
const { Account } = require('../lib/account');
const { oauth2Apps } = require('../lib/oauth2-apps');
const { redis, notifyQueue, submitQueue, documentsQueue, getFlowProducer } = require('../lib/db');
Expand Down Expand Up @@ -203,7 +203,7 @@ class ConnectionHandler {
}

if (!accountObject.connection) {
accountObject.connection = new IMAPConnection(account, {
accountObject.connection = new IMAPClient(account, {
runIndex,

accountObject,
Expand Down

0 comments on commit 04c2aa9

Please sign in to comment.