@bettercorp/service-base-plugin-smtp-server
Advanced tools
Comparing version 1.0.20211016193422 to 2.0.20220128233959
@@ -1,2 +0,2 @@ | ||
import { CPlugin, CPluginClient } from '@bettercorp/service-base/lib/ILib'; | ||
import { CPlugin, CPluginClient } from '@bettercorp/service-base/lib/interfaces/plugins'; | ||
import { ISMTPServerConfig } from './config'; | ||
@@ -20,10 +20,18 @@ export interface ISMTPServerOnAuthRequest extends ISMTPServerOnRequest { | ||
readonly _pluginName: string; | ||
onError(listener: (err: any) => void): void; | ||
onAuth(listener: (resolve: PromiseResolve<any, void>, reject: PromiseResolve<any, void>, request: ISMTPServerOnAuthRequest) => void): void; | ||
onConnect(listener: (resolve: PromiseResolve<any, void>, reject: PromiseResolve<any, void>, request: ISMTPServerOnRequest) => void): void; | ||
onClose(listener: (request: ISMTPServerOnRequest) => void): void; | ||
onEmail(listener: (request: ISMTPServerOnMailRequest) => void): void; | ||
onEmailSpecific(emailAddress: string, listener: (request: ISMTPServerOnMailRequest) => void): void; | ||
onMailFrom(listener: (resolve: PromiseResolve<any, void>, reject: PromiseResolve<any, void>, request: ISMTPServerOnMailFromRequest) => void): void; | ||
onRcptTo(listener: (resolve: PromiseResolve<any, void>, reject: PromiseResolve<any, void>, request: ISMTPServerOnMailFromRequest) => void): void; | ||
onError(listener: (err: any) => void): Promise<void>; | ||
onAuth(listener: { | ||
(request?: ISMTPServerOnAuthRequest): Promise<void>; | ||
}): Promise<void>; | ||
onConnect(listener: { | ||
(request?: ISMTPServerOnRequest): Promise<void>; | ||
}): Promise<void>; | ||
onClose(listener: (request: ISMTPServerOnRequest) => void): Promise<void>; | ||
onEmail(listener: (request: ISMTPServerOnMailRequest) => void): Promise<void>; | ||
onEmailSpecific(emailAddress: string, listener: (request: ISMTPServerOnMailRequest) => void): Promise<void>; | ||
onMailFrom(listener: { | ||
(request?: ISMTPServerOnMailFromRequest): Promise<void>; | ||
}): Promise<void>; | ||
onRcptTo(listener: { | ||
(request?: ISMTPServerOnMailFromRequest): Promise<void>; | ||
}): Promise<void>; | ||
} | ||
@@ -30,0 +38,0 @@ export declare class Plugin extends CPlugin<ISMTPServerConfig> { |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Plugin = exports.smtpServer = void 0; | ||
const ILib_1 = require("@bettercorp/service-base/lib/ILib"); | ||
const plugins_1 = require("@bettercorp/service-base/lib/interfaces/plugins"); | ||
const config_1 = require("./config"); | ||
@@ -18,3 +9,3 @@ const SMTPServer = require("smtp-server").SMTPServer; | ||
const SPF = require('spf-check'); | ||
class smtpServer extends ILib_1.CPluginClient { | ||
class smtpServer extends plugins_1.CPluginClient { | ||
constructor() { | ||
@@ -24,29 +15,29 @@ super(...arguments); | ||
} | ||
onError(listener) { | ||
this.onEvent(config_1.ISMTPServerEvents.onError, listener); | ||
async onError(listener) { | ||
await this.onEvent(config_1.ISMTPServerEvents.onError, listener); | ||
} | ||
onAuth(listener) { | ||
this.onReturnableEvent(config_1.ISMTPServerEvents.onAuth, listener); | ||
async onAuth(listener) { | ||
await this.onReturnableEvent(config_1.ISMTPServerEvents.onAuth, listener); | ||
} | ||
onConnect(listener) { | ||
this.onReturnableEvent(config_1.ISMTPServerEvents.onConnect, listener); | ||
async onConnect(listener) { | ||
await this.onReturnableEvent(config_1.ISMTPServerEvents.onConnect, listener); | ||
} | ||
onClose(listener) { | ||
this.onEvent(config_1.ISMTPServerEvents.onClose, listener); | ||
async onClose(listener) { | ||
await this.onEvent(config_1.ISMTPServerEvents.onClose, listener); | ||
} | ||
onEmail(listener) { | ||
this.onEvent(config_1.ISMTPServerEvents.onEmail, listener); | ||
async onEmail(listener) { | ||
await this.onEvent(config_1.ISMTPServerEvents.onEmail, listener); | ||
} | ||
onEmailSpecific(emailAddress, listener) { | ||
this.onEvent((0, config_1.getEmailSpecific)(emailAddress), listener); | ||
async onEmailSpecific(emailAddress, listener) { | ||
await this.onEvent((0, config_1.getEmailSpecific)(emailAddress), listener); | ||
} | ||
onMailFrom(listener) { | ||
this.onReturnableEvent(config_1.ISMTPServerEvents.onMailFrom, listener); | ||
async onMailFrom(listener) { | ||
await this.onReturnableEvent(config_1.ISMTPServerEvents.onMailFrom, listener); | ||
} | ||
onRcptTo(listener) { | ||
this.onReturnableEvent(config_1.ISMTPServerEvents.onRcptTo, listener); | ||
async onRcptTo(listener) { | ||
await this.onReturnableEvent(config_1.ISMTPServerEvents.onRcptTo, listener); | ||
} | ||
} | ||
exports.smtpServer = smtpServer; | ||
class Plugin extends ILib_1.CPlugin { | ||
class Plugin extends plugins_1.CPlugin { | ||
constructor() { | ||
@@ -58,5 +49,5 @@ super(...arguments); | ||
const self = this; | ||
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { | ||
return new Promise(async (resolve) => { | ||
let SMTP_SERVER = null; | ||
SMTP_SERVER = new SMTPServer(Object.assign({ banner: (yield self.getPluginConfig()).banner || 'BetterCorp SMTP Server', onAuth: self.onAuth, onConnect: self.onConnect, onClose: self.onClose, onMailFrom: self.onMailFrom, onRcptTo: self.onRcptTo, onData: self.onData }, ((yield self.getPluginConfig()).serverOptions || {}))); | ||
SMTP_SERVER = new SMTPServer(Object.assign({ banner: (await self.getPluginConfig()).banner || 'BetterCorp SMTP Server', onAuth: self.onAuth, onConnect: self.onConnect, onClose: self.onClose, onMailFrom: self.onMailFrom, onRcptTo: self.onRcptTo, onData: self.onData }, ((await self.getPluginConfig()).serverOptions || {}))); | ||
SMTP_SERVER.on("error", (err) => { | ||
@@ -66,6 +57,6 @@ self.log.info("Error %s", err.message); | ||
}); | ||
SMTP_SERVER.listen((yield self.getPluginConfig()).port || 2525); | ||
self.log.info(`Server started on port ${(yield self.getPluginConfig()).port || 2525}`); | ||
SMTP_SERVER.listen((await self.getPluginConfig()).port || 2525); | ||
self.log.info(`Server started on port ${(await self.getPluginConfig()).port || 2525}`); | ||
resolve(); | ||
})); | ||
}); | ||
} | ||
@@ -88,96 +79,78 @@ CleanData(data) { | ||
; | ||
// TODO: Fix SPF Validation | ||
SPFValidate(email, clientIp) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
/*return new Promise((resolve) => { | ||
resolve({ | ||
result: SPF.Neutral | ||
}); | ||
});*/ | ||
let cleanEmail = this.CleanData(email); | ||
let emailData = cleanEmail.split('@'); | ||
return new SPF.SPF(emailData[1], cleanEmail, (yield this.getPluginConfig()).spfOptions || {}).check(clientIp); | ||
}); | ||
async SPFValidate(email, clientIp) { | ||
let cleanEmail = this.CleanData(email); | ||
let emailData = cleanEmail.split('@'); | ||
return new SPF.SPF(emailData[1], cleanEmail, (await this.getPluginConfig()).spfOptions || {}).check(clientIp); | ||
} | ||
onAuth(auth, session, callback) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
this.log.info('Auth Request'); | ||
this.log.debug(auth); | ||
if ((yield this.getPluginConfig()).events.onAuth === true) { | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onAuth, { | ||
auth: auth, | ||
session: session | ||
}).then(x => callback(null, x)).catch(x => callback(x || new Error('Unknown Error'))); | ||
} | ||
return callback(new Error("Invalid username or password")); | ||
}); | ||
async onAuth(auth, session, callback) { | ||
this.log.info('Auth Request'); | ||
this.log.debug(auth); | ||
if ((await this.getPluginConfig()).events.onAuth === true) { | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onAuth, { | ||
auth: auth, | ||
session: session | ||
}).then(x => callback(null, x)).catch(x => callback(x || new Error('Unknown Error'))); | ||
} | ||
return callback(new Error("Invalid username or password")); | ||
} | ||
onConnect(session, callback) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
this.log.info(`Received SMTP request from ${session.remoteAddress}`); | ||
if ((yield this.getPluginConfig()).events.onConnect === true) { | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onConnect, { | ||
session: session | ||
}).then(x => callback()).catch(x => callback(x || new Error('Unknown Error'))); | ||
} | ||
return callback(); | ||
}); | ||
async onConnect(session, callback) { | ||
this.log.info(`Received SMTP request from ${session.remoteAddress}`); | ||
if ((await this.getPluginConfig()).events.onConnect === true) { | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onConnect, { | ||
session: session | ||
}).then(x => callback()).catch(x => callback(x || new Error('Unknown Error'))); | ||
} | ||
return callback(); | ||
} | ||
onClose(session) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
this.log.info(`Received SMTP request from ${session.remoteAddress} - CLOSED`); | ||
if ((yield this.getPluginConfig()).events.onClose === true) | ||
return this.emitEvent(null, config_1.ISMTPServerEvents.onClose, { | ||
session: session | ||
}); | ||
}); | ||
} | ||
onMailFrom(address, session, callback) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const self = this; | ||
this.log.info(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address}`); | ||
session._sender = address; | ||
if ((yield this.getPluginConfig()).events.onMailFrom === true) | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onMailFrom, { | ||
address: address, | ||
session: session | ||
}).then(x => callback()).catch(x => callback(x || new Error('Unknown Error'))); | ||
return this.SPFValidate(address.address, session.remoteAddress).then(result => { | ||
if (result.result === SPF.Pass || result.result === SPF.Neutral) { | ||
self.log.info(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address} - SPF PASS: ${result.result}`); | ||
return callback(); | ||
} | ||
self.log.error(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address} - SPF FAILED: ${result.result}`); | ||
return callback(new Error("Server error occured!")); | ||
}).catch(x => { | ||
self.log.error(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address} - SPF FAILED ERR`); | ||
self.log.error(x); | ||
return callback(new Error("Server error occured!")); | ||
async onClose(session) { | ||
this.log.info(`Received SMTP request from ${session.remoteAddress} - CLOSED`); | ||
if ((await this.getPluginConfig()).events.onClose === true) | ||
return this.emitEvent(null, config_1.ISMTPServerEvents.onClose, { | ||
session: session | ||
}); | ||
}); | ||
} | ||
onRcptTo(address, session, callback) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
this.log.info(`Received SMTP request from ${session.remoteAddress} {TO} ${address.address}`); | ||
session._receiver = address; | ||
if ((yield this.getPluginConfig()).events.onRcptTo === true) | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onRcptTo, { | ||
address: address, | ||
session: session | ||
}).then(x => callback()).catch(x => callback(x || new Error('Unknown Error'))); | ||
//if (features.runningInDebug) | ||
// return callback(); | ||
let cleanEmail = this.CleanData(address.address); | ||
let emailData = cleanEmail.split('@'); | ||
for (let mailHost of ((yield this.getPluginConfig()) || {}).domains || []) { | ||
let debugHost = emailData[1].toLowerCase(); | ||
this.log.debug(`Received SMTP request from ${session.remoteAddress} {TO} ${address.address} - [${debugHost}] ==? [${mailHost}]`); | ||
if (mailHost === debugHost) { | ||
return callback(); | ||
} | ||
async onMailFrom(address, session, callback) { | ||
const self = this; | ||
this.log.info(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address}`); | ||
session._sender = address; | ||
if ((await this.getPluginConfig()).events.onMailFrom === true) | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onMailFrom, { | ||
address: address, | ||
session: session | ||
}).then(x => callback()).catch(x => callback(x || new Error('Unknown Error'))); | ||
return this.SPFValidate(address.address, session.remoteAddress).then(result => { | ||
if (result.result === SPF.Pass || result.result === SPF.Neutral) { | ||
self.log.info(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address} - SPF PASS: ${result.result}`); | ||
return callback(); | ||
} | ||
this.log.error(`Received SMTP request from ${session.remoteAddress} {TO} ${address.address} - DOMAIN NOT VALID`); | ||
self.log.error(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address} - SPF FAILED: ${result.result}`); | ||
return callback(new Error("Server error occured!")); | ||
}).catch(x => { | ||
self.log.error(`Received SMTP request from ${session.remoteAddress} {FROM} ${address.address} - SPF FAILED ERR`); | ||
self.log.error(x); | ||
return callback(new Error("Server error occured!")); | ||
}); | ||
} | ||
async onRcptTo(address, session, callback) { | ||
this.log.info(`Received SMTP request from ${session.remoteAddress} {TO} ${address.address}`); | ||
session._receiver = address; | ||
if ((await this.getPluginConfig()).events.onRcptTo === true) | ||
return this.emitEventAndReturn(null, config_1.ISMTPServerEvents.onRcptTo, { | ||
address: address, | ||
session: session | ||
}).then(x => callback()).catch(x => callback(x || new Error('Unknown Error'))); | ||
//if (features.runningInDebug) | ||
// return callback(); | ||
let cleanEmail = this.CleanData(address.address); | ||
let emailData = cleanEmail.split('@'); | ||
for (let mailHost of ((await this.getPluginConfig()) || {}).domains || []) { | ||
let debugHost = emailData[1].toLowerCase(); | ||
this.log.debug(`Received SMTP request from ${session.remoteAddress} {TO} ${address.address} - [${debugHost}] ==? [${mailHost}]`); | ||
if (mailHost === debugHost) { | ||
return callback(); | ||
} | ||
} | ||
this.log.error(`Received SMTP request from ${session.remoteAddress} {TO} ${address.address} - DOMAIN NOT VALID`); | ||
return callback(new Error("Server error occured!")); | ||
} | ||
onData(stream, session, callback) { | ||
@@ -191,3 +164,3 @@ if (session._quiet === true) { | ||
let dataOkay = false; | ||
this.streamToString(stream).then((x) => __awaiter(this, void 0, void 0, function* () { | ||
this.streamToString(stream).then(async (x) => { | ||
if (!dataOkay) { | ||
@@ -220,3 +193,3 @@ return self.log.info(`Received SMTP request from ${session.remoteAddress} {BODY} - TOO LARGE, NO PASS`); | ||
}); | ||
})).catch((err) => { | ||
}).catch((err) => { | ||
self.log.info(`Received SMTP request from ${session.remoteAddress} {BODY} - BODY FAILED TO PARSE`); | ||
@@ -223,0 +196,0 @@ self.log.error(err); |
@@ -1,1 +0,1 @@ | ||
{"name":"@bettercorp/service-base-plugin-smtp-server","license":"AGPL-3.0-only","repository":{"url":"https://gitlab.com/BetterCorp/public/service-base-plugin-smtp-server"},"scripts":{"build":"tsc","version":"node ./node_modules/@bettercorp/service-base/build/version.js $0","create":"ts-node node_modules/@bettercorp/service-base/lib/bootstrap.js $0"},"files":["lib/**/*"],"main":"lib/index.js","version":"1.0.20211016193422","dependencies":{"@bettercorp/service-base":"^6.0.20211016180933","@bettercorp/tools":"^1.1.20210611181403","@types/node":"^14.17.7","mailparser":"^3.4.0","smtp-server":"^3.9.0","spf-check":"^0.4.3"},"devDependencies":{"ts-node":"^10.3.0","tslint":"^6.1.3","typescript":"^4.4.4"},"bsb_project":true} | ||
{"name":"@bettercorp/service-base-plugin-smtp-server","license":"AGPL-3.0-only","repository":{"url":"https://gitlab.com/BetterCorp/public/service-base-plugin-smtp-server"},"scripts":{"build":"tsc","dev":"nodemon --config node_modules/@bettercorp/service-base/build/nodemon.json","start":"ts-node node_modules/@bettercorp/service-base/lib/index.js","create":"ts-node node_modules/@bettercorp/service-base/lib/bootstrap.js $0","version":"node ./node_modules/@bettercorp/service-base/build/version-bcorp.js $0"},"files":["lib/**/*"],"main":"lib/index.js","version":"2.0.20220128233959","bsb_project":true,"devDependencies":{"eslint":"^8.8.0","ts-node":"^10.4.0","typescript":"^4.5.5"},"dependencies":{"@bettercorp/service-base":"^7.4.20220115132048","@bettercorp/tools":"^1.3.20220126151136","@types/node":"^17.0.13","mailparser":"^3.4.0","smtp-server":"^3.9.0","spf-check":"^0.4.3"}} |
Sorry, the diff of this file is not supported yet
60663
338
+ Added@bettercorp/service-base@7.6.20220531162851(transitive)
+ Added@types/node@17.0.45(transitive)
- Removed@bettercorp/service-base@6.1.20211220205712(transitive)
- Removed@types/node@14.18.63(transitive)
Updated@types/node@^17.0.13